Wie greife ich auf den letzten Rückgabewert in bash zu?

69

Einfaches Szenario: Ich suche nach einer wsdlDatei, die mitten in einem Projekt verloren gegangen ist.

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

Jetzt, da ich weiß, wo es ist, möchte ich etwas mit dieser Datei machen, sagen wir, sie bearbeiten. Ist es möglich, anstatt den Pfad hinter meinem Befehl zu kopieren / einzufügen, den zuvor zurückgegebenen Pfad zu verwenden find? Genauso wie es möglich ist, auf das letzte Argument zuzugreifen, mit dem Sie geschrieben haben, !$oder auf den letzten Befehl, mit dem Sie geschrieben haben !!.
Ich habe gelesen, dass es mit möglich war $?, aber es gibt mir nur einen Fehler zurück:0: command not found

$ echo $?
0: command not found
Anto
quelle
3
Dies ist nicht der Rückgabewert, sondern die Ausgabe!
MirandaVeracruzDeLaHoyaCardina
Zur Erläuterung ist der "Rückgabewert" immer eine Zahl. Normalerweise bedeutet 0 Erfolg und eine Abweichung von Null bedeutet eine Art Fehler. Die Zeichenfolge (oder der Text), die der Befehl ausgibt, wird als "Ausgabe" und nicht als "Rückgabewert" bezeichnet.
Michael Dorst

Antworten:

33

Führen Sie den Befehl in der Befehlsersetzung aus:

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

Die Ausgabe wird nun in der outputVariablen gespeichert , die Sie beliebig oft verwenden können.

Choroba
quelle
11
Dies ist keine richtige Antwort. $? ist.
mcmlxxxiii
@mcmlxxxiii: $?enthält keine Pfade.
Choroba
1
Ich entschuldige mich und war durch den Missbrauch des Begriffs returnin der Frage verwirrt . Ihre Antwort ist absolut richtig für die obige Frage.
mcmlxxxiii
4
$?Enthält den Ausgangsstatus des letzten Befehls
Brett Wagner
Das war die Antwort, nach der ich gesucht habe. Ich interessiere mich für die Ausgabe des vorherigen Befehls, nicht für den Erfolg / Misserfolg-Rückgabewert. Also vielen Dank!
Joshua Pinter
74

Dafür gibt es keine spezielle Bash-Variable.

$? Enthält den Exit-Code des letzten Befehls (0 = Erfolg,> 0 = Fehlercode)

Sie können die Ausgabe von findmit dem -execFlag wie folgt verwenden:

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

Das {}wird durch den Dateinamen ersetzt, der von gefunden wird find. Dies würde den Befehl für jede gefundene Datei ausführen. Wenn Sie einen Befehl mit allen gefundenen Dateien als Argumente ausführen möchten, verwenden Sie +am Ende Folgendes:

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

Dies würde eine emacs-Instanz mit allen gefundenen .wsdl-Dateien öffnen, die darin geöffnet sind.

Eine allgemeinere Lösung besteht darin, die Ausgabe in einer Variablen zu speichern:

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

Dies funktioniert bei allen Befehlen, nicht nur beim Finden. Sie können aber auch Folgendes verwenden xargs:

  find -name '*.wsdl' | xargs emacs {}
ahilsend
quelle
Ist es möglich $?, den Exit-Code eines anderen Befehls zurückzugeben? zB ping 1.1.1.1 -w 10; $ zurückgeben?
19.
1
$?Enthält den Exit-Code des vorherigen Befehls. Die Antwort lautet also ja.
ahilsend
43

Hier ist ein kurzer Hack, der mit minimalen Tastenanschlägen tun sollte, was Sie wollen, wenn es Ihnen nichts ausmacht, dass der letzte Befehl zweimal ausgeführt wird.

Verwenden Sie backtick, unter anderem:

`!!`

z.B

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

* edit: Ich sehe, dass die oben verlinkte "möglicherweise betrogene" Frage auch diese Antwort enthält. immer noch direkt relevant für diesen, also lass es, aber entschuldige den Betrug.

rauben
quelle
2
Sehr schlau. Ich denke, dies sollte die akzeptierte Antwort sein, da es den häufigsten Fall löst, dass Sie nicht wissen, dass Sie die Ausgabe benötigen, bis Sie den Befehl bereits ausgeführt haben.
Paul Ruane
1
Ich stimme zu, das ist, wonach ich hierher gekommen bin. Wenn Sie in der vorherigen Zeile etwas tun, verlieren Sie meinen Zweck, rückwirkend zu entscheiden, dass Sie etwas mit dem zuletzt zurückgegebenen Wert tun möchten. (Überprüfen Sie eine Filiale, die ich git br | grepin meinem Fall über gefunden habe)
Jack Casey
Einer meiner Favoriten, das ist! Denken Sie, ich mache das jeden Tag.
MetalGodwin
Ich finde es sehr klug, dass man das kann, aber nicht sicher, wie nützlich es wirklich ist. Ist das Tippen !!so viel einfacher als das Drücken der Aufwärtstaste? Und dann können Sie immer noch Ihren Befehl sehen. Wenn es akzeptabel ist, den Befehl erneut auszuführen, ist das Drücken genauso einfach (und ein bisschen verständlicher und transparenter)
Svend Hesselholt Henne Hansen