eine Bash-Pipe-Befehls-Exit-Coderegel

1726
Chihaya

Ich schrieb ein einfaches Skript, das die Ausgabe eines Befehls überprüft, wenn ein bestimmtes Schlüsselwort angezeigt wird. Um zu sehen, ob es funktioniert, habe ich den Befehl von der Bash-Befehlszeile aus überprüft.

 $ ls | grep -q foo $ echo $? 

Es wird 1 oder 0 angezeigt, abhängig von der Befehlsausgabe und einem grep-Parameter.

Ich bin etwas faul, den Befehl noch einmal einzugeben, also habe ich | echo $?am Ende der Befehlszeile hinzugefügt .

 $ ls | grep -q foo | Echo $? 

Unabhängig von der Befehlsausgabe gibt es immer 0 zurück, auch wenn der erste Teil 1 zurückgibt.

Ich denke, das ist ein normales Verhalten, aber ich würde gerne wissen, warum Bash auf diese Weise funktioniert.

-1
ähnlich: http://superuser.com/questions/280879/exit-value-with-piped-commands-in-bash?rq=1 golimar vor 7 Jahren 0

2 Antworten auf die Frage

2
janos

Die spezielle Variable $? erweitert sich auf den Exit-Status der zuletzt ausgeführten Vordergrundpipeline . In Ihrem Beispiel | echo $?ist dies die zuletzt ausgeführte Vordergrundpipeline. Zu diesem Zeitpunkt ist der Exit-Status des Befehls vor dem letzten Befehl |nicht mehr über erreichbar $?.

In einem verwandten Hinweis können Sie den Exit-Code direkt in bedingten Anweisungen verwenden. Beispiel:

if ls | grep -q foo; then echo success, there is foo; fi 

Oder, wenn Sie bei Erfolg etwas ausführen möchten, können Sie den nächsten Befehl folgendermaßen verketten &&:

ls | grep -q foo && echo success 
1
ojs

Dies liegt daran, dass die Pipe das stdout nimmt und an den nächsten Befehl weiterleitet. Stattdessen möchten Sie das Semikolon verwenden.

ls | grep -q foo; echo $?

Damit wurden die Befehle und beendet lsund grepder echoBefehl ausgeführt.