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

69

Scénario simple: je recherche un wsdlfichier 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 derrière ma commande, est-il possible d'utiliser le chemin renvoyé par findplus tôt? Tout comme il est possible d'accéder au dernier argument que vous avez tapé !$ou à votre dernière commande !!.
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
Anto
la source
3
Ce n'est pas la valeur de retour, c'est la sortie!
MirandaVeracruzDeLaHoyaCardina
Pour élaborer, la "valeur de retour" est toujours un nombre. Habituellement, 0 signifie le succès et non nul signifie un échec. La chaîne (ou le texte) que la commande crache est appelée "sortie", pas "valeur de retour".
Michael Dorst le

Réponses:

33

Exécutez la commande dans la substitution de commande:

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

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

choroba
la source
11
Ce n'est pas une réponse correcte. $? est.
mcmlxxxiii
@mcmlxxxiii: $?ne contient pas les chemins.
Choroba
1
Mes excuses, j'ai été dérouté par l'utilisation abusive du terme returndans la question. Votre réponse est absolument correcte pour la question ci-dessus.
mcmlxxxiii
4
$?contient le statut de sortie de la dernière commande
Brett Wagner
C'était la réponse que je cherchais. Je m'intéresse à la sortie de la commande précédente et non à la valeur de retour succès / échec. Alors merci!
Joshua Pinter
74

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 findavec le -execdrapeau, comme ceci:

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

Le {}est remplacé par le nom du 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 en tant qu'arguments, utilisez une +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 le résultat 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 {}
ahilsend
la source
Est-il possible $?de retourner le code de sortie d'une autre commande? par exemple, ping 1.1.1.1 -w 10; retour $?
Twnaing
1
$?contient le code de sortie de la commande précédente, quelle qu’elle soit. Donc, la réponse est oui.
ahilsend
43

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

Utilisez backtick, ala:

`!!`

par exemple

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

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

Rob
la source
2
Très intelligent. Je pense que cela devrait être la réponse acceptée car cela résout le cas le plus courant de ne pas savoir que vous avez besoin de la sortie tant que vous n'avez pas déjà exécuté la commande.
Paul Ruane
1
Je suis d’accord, c’est ce que je suis venu chercher ici. Faire quoi que ce soit sur la ligne précédente va à l'encontre de mon objectif, qui consiste à décider de manière rétroactive que je souhaite faire quelque chose avec la dernière valeur renvoyée. (Commander une branche que j'ai trouvé via git br | grepdans mon cas)
Jack Casey
Un de mes favoris, c'est! Pense que je fais cela au jour le jour.
MetalGodwin
Je pense que c'est très intelligent de pouvoir le faire, mais je ne sais pas à quel point c'est utile. Est-ce que la frappe !!est beaucoup plus facile que d'appuyer sur la touche haut? Et alors vous pouvez toujours voir votre commande. Si exécuter à nouveau la commande est acceptable, je pense que simplement appuyer est aussi facile (et un peu plus compréhensible et transparent),
Svend Hesselholt Henne Hansen