Comment accéder à la dernière valeur de retour dans bash?

53

Scénario simple: je recherche un fichier wsdl perdu au milieu d’un projet.

$ find -name '*.wsdl'
./some/very/very/long/way/to/some/lost/directory/filename.wsdl

Maintenant que je sais où c'est, je veux faire quelque chose avec ce fichier, disons le modifier. Au lieu de copier / coller le chemin derrière ma commande, est-il possible d'utiliser le chemin renvoyé par find plus tôt? Tout comme il est possible d'accéder au dernier argument que vous avez tapé avec !$ ou la dernière commande avec !! .
J'ai lu que c'était possible avec $? , mais cela ne me renvoie qu'une erreur: 0: command not found

$ echo $?
0: command not found
    
posée Anto 25.07.2013 - 15:46
la source

3 réponses

29

Exécutez la commande dans la substitution de commande:

output=$( find -name '*.wsdl' )
echo "$output"

La sortie est maintenant stockée dans la variable output que vous pouvez utiliser autant de fois que vous le souhaitez.

    
réponse donnée choroba 25.07.2013 - 15:57
la source
59

Il n’ya pas de variable bash spéciale pour cela.

$? contient le code de sortie de la dernière commande (0 = succès, & gt; 0 = code d'erreur)

Vous pouvez utiliser la sortie de find avec l’indicateur -exec , comme ceci:

 find -name  '*.wsdl' -exec emacs {} \;

Le {} est remplacé par le nom de fichier trouvé par find . Cela exécuterait la commande pour chaque fichier trouvé. Si vous voulez exécuter une commande avec tous les fichiers trouvés comme arguments, utilisez un + à la fin comme ceci:

  find -name '*.wsdl' -exec emacs {} +

Cela ouvrirait une instance emacs avec tous les fichiers .wsdl trouvés ouverts.

Une solution plus générale consiste à stocker la sortie dans une variable:

result=$(find -name '*.wsdl')
emacs $result

Cela fonctionne avec toutes les commandes, pas seulement trouver. Bien que vous puissiez aussi utiliser xargs :

  find -name '*.wsdl' | xargs emacs {}
    
réponse donnée ahilsend 25.07.2013 - 16:12
la source
32

Voici un rapide hack qui devrait faire ce que vous voulez avec un minimum de frappes, si cela ne vous dérange pas que la dernière commande soit exécutée deux fois.

Utiliser backtick, ala:

'!!'

par exemple

$ find . -name HardToFind.txt
some/crazy/path/to/HardToFind.txt
$ vim '!!'

* edit: Je vois la question ci-dessus "éventuellement dupée" contient également cette réponse. toujours pertinent directement à celui-ci, alors le laisser, mais désolé pour la dupe.

    
réponse donnée Rob 12.09.2014 - 06:50
la source

Lire d'autres questions sur les étiquettes