101 votes

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

Scénario simple : je cherche un wsdl fichier 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ù il se trouve, je veux faire quelque chose avec ce fichier, disons le modifier. Au lieu de copier/coller le chemin d'accès derrière ma commande, est-il possible d'utiliser le chemin d'accès renvoyé par la commande find plus tôt ? Tout comme il est possible d'accéder au dernier argument que vous avez tapé avec !$ ou votre dernière commande avec !! .
J'ai lu que c'était possible avec $? mais je ne reçois qu'une erreur : 0: command not found

$ echo $?
0: command not found

97voto

ahilsend Points 1420

Il n'y a pas de variable bash spéciale pour cela.

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

Vous pouvez utiliser la sortie de find avec le -exec drapeau, comme ceci :

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

El {} est remplacé par le nom du fichier trouvé par find . Cela permet d'exécuter la commande pour chaque fichier trouvé. Si vous voulez exécuter une commande avec tous les fichiers trouvés en tant qu'arguments, utilisez une commande + à la fin, comme ça :

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

Cela ouvrirait une instance d'emacs avec tous les fichiers .wsdl trouvés ouverts dans celle-ci.

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 find. Bien que vous puissiez également utiliser xargs :

  find -name '*.wsdl' | xargs emacs {}

59voto

user29484 Points 51

Voici une petite astuce qui devrait vous permettre de faire ce que vous voulez avec un minimum de frappes, si vous ne voyez pas d'inconvénient à ce que la dernière commande soit exécutée deux fois.

Utilisez le backtick, ala :

`!!`

par exemple

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

*J'ai vu que la question ci-dessus "possiblement dupliquée" contient aussi cette réponse. Elle est toujours en rapport direct avec celle-ci, donc je la laisse, mais désolé pour le doublon.

42voto

John O'Brien Points 21

Exécutez la commande dans la substitution de commande :

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

La sortie est maintenant stockée dans le fichier output que vous pouvez utiliser autant de fois que vous le souhaitez, avec la commande suivante :

echo "$output"

0voto

racoon_lord Points 111

`!!` est une excellente solution, mais si vous voulez être encore plus rapide, vous pouvez utiliser des alias.

Malheureusement, ça ne marchera pas :

~$ alias test='echo `!!`'
~$ test
zsh: command not found: !!

Utilisez plutôt `fc -e -` Exemples de pseudonymes que j'utilise :

sortie de copie :

alias co='echo `fc -e -` | xclip -in -selection clipboard'

ouvrir avec vim ; si la sortie a beaucoup de lignes, ouvre toutes les lignes dans des onglets :

alias vo='vim -p `fc -e -`'

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X