2016-04-27 3 views
1

Ich weiß ein wenig von bash Rückkehrcodes auf erfolgreiche/Fehlerbedingungen, aber ich experimentierte ein wenig mit wait auf Hintergrundprozesse auf paar von Skripte auf if Zustand und ich war überrascht, dass das Verhalten auf den Return-Fehlercodes 0 für den Erfolg und nicht-Null für Fehlerfälle zu sehen.Wait Prozess-ID auf eine Bash If-Condition Fehlercode 1 für erfolgreiche Beendigung des Prozesses

Meine Skripte: -

$cat foo.sh 
#!/bin/bash 
sleep 5 

$cat bar.sh 
#!/bin/bash 
sleep 10 

$cat experiment.sh 
./foo.sh & 
pid1=$! 

./bar.sh & 
pid2=$! 

if wait $pid1 && wait $pid2 
then 
    echo "Am getting screwed here!" 
else 
    echo "Am supposed to be screwed here!" 
fi 

das Skript ausführen, wie es ist und die Ausgabe als Am getting screwed here! statt Am supposed to be screwed here!

$./experiment.sh 
Am getting screwed here! 

nun die Skripte modifiziert werden, um mit Nachdruck Exit-Codes zurückgeben mit exit in beide bekommen foo.sh

$cat foo.sh 
#!/bin/bash 
sleep 5 
exit 2 

$cat bar.sh 
#!/bin/bash 
sleep 10 
exit 17 

Und sind überrascht, die Ausgabe als

$./experiment.sh 
Am supposed to be screwed here! 

Apologize für die detaillierte Post, aber jede Hilfe dankbar zu sehen. Die man-Seite als Referenz: - http://ss64.com/bash/wait.html

Antwort

2

Das ist richtiges Verhalten. Der Exit-Status wait (wenn er mit einer einzelnen Prozess-ID aufgerufen wird) ist der Exit-Status des Prozesses, auf den gewartet wird. Da mindestens einer von ihnen einen Nicht-Null-Exit-Status hat, schlägt die && Liste fehl und der else-Zweig wird genommen.

Das Grundprinzip ist, dass eine Möglichkeit besteht (0) für einen Befehl, um zu folgen, aber viele Möglichkeiten (beliebige ganze Zahl ungleich Null), dafür zu versagen. Verwechseln Sie nicht bash die Verwendung von Exit-Status mit der Standard-Booleschen Interpretation von 0 als false und ungleich Null als true. Die Shell-Anweisung if überprüft, ob ihr Befehl erfolgreich ist.

+0

Gute Erklärung! Aber ich bekomme immer noch nicht die Tatsache, warum 'if wait $ pid1 && wait $ pid2' als 'if (1)' für den ersten Teil der Frage ausgewertet wird, wenn die Skripte erfolgreich zurückgeliefert wurden. Sie haben gesagt, 'wait', wenn Sie mit einem Prozess aufgerufen werden, gibt den Status des Prozesses, auf den gewartet wird, zurück. Wenn das der Fall ist, sollte nicht der erste Teil zu "if (0)" ausgewertet werden, wobei beide "wait" (s) erfolgreich zurückgeliefert werden? – Inian

+0

Ich glaube, Sie missverstehen Ausgangscodes und "if" -Aussagen. Erstellen Sie ein Skript mit Ihrer 'if'-Anweisung und ersetzen Sie die' wait'-Befehle durch 'true'. – Mort

+0

@ Mort, @ chepner: Bear mit mir, während ich vorbei komme :)! Alles, was ich zu verstehen versuche, ist, wie sich 'if (0 && 0)' zu einer positiven Bedingung auswirkt. Verzeih mir, wenn ich etwas Grundlegendes verpasse. – Inian