Was ist der Unterschied zwischen && und; beim Gabeln des Schlafes in den Hintergrund?

8

Ich habe gerade eine Frage gestellt, wie man einen Prozess dazu bringt, im Hintergrund zu schlafen.
Die Notation, die ich mir ausgedacht habe, sieht folgendermaßen aus:

sleep 10 && echo "hello world" &

Diese Antwort auf eine andere Frage verwendet ein anderes Format.

( sleep 10 ; echo "hello world" ) &

Ich weiß, &&dass der zweite Prozess nur gestartet werden kann, wenn der erste true zurückgibt. Kann der Schlaf versagen? Gibt es eine Situation, in der ich eine der anderen vorziehen sollte?

Baarn
quelle

Antworten:

12

Der Ruhezustand kann fehlschlagen, wenn er während der Ausführung beendet wird:

$ sleep 2
$ echo "$?"
0
$ sleep 2
^C
$ echo "$?"
130

Da sleep eine externe ausführbare Datei ist, ist es auch denkbar, dass die Fork- oder Exec-Aufrufe fehlschlagen, was auch dazu führen würde, dass bash einen Fehlercode> 0 generiert.

Chris Down
quelle
5

a; bführt immer den zweiten Befehl nach dem ersten aus, während a && bder zweite Befehl nur ausgeführt wird, wenn der erste erfolgreich ist, dh nur, wenn der erste Befehl den Status 0 zurückgibt.

sleepGibt immer den Status 0 zurück, außer wenn er durch ein Signal beendet wird. In diesem Fall lautet der Status 128 + Signalnummer. (Der Status kann auch 126 oder 127 sein, wenn der sleepBefehl nicht vorhanden ist oder das Programm aufgrund fehlender Ressourcen nicht gestartet werden kann. Es ist jedoch sehr unwahrscheinlich, dass diese Fälle auftreten.)

Daher sollten Sie verwenden ;oder &&abhängig davon, was passieren soll, wenn der Schlaf unterbrochen wird:

  • sleep 10; echo hellodruckt die Nachricht nach 10 Sekunden (weniger, wenn sie sleepdurch ein Signal getötet wird);
  • sleep 10 && echo hellodruckt die Nachricht nach 10 Sekunden, druckt jedoch nichts, wenn sie sleepdurch ein Signal beendet wird.
Gilles 'SO - hör auf böse zu sein'
quelle
3

Sie sollten davon ausgehen, dass ein Befehl aus verschiedenen Gründen fehlschlagen kann, auch wenn ein Ausfall des Schlafes in der Tat sehr unwahrscheinlich ist.

( sleep 10 ; echo "hello world" ) &

bedeutet Hintergrundschlaf und Echo nach dem Ruhezustand ausführen, aber wenn der Schlaf fehlschlägt, wird das Echo trotzdem ausgeführt, siehe vollständige Erklärung

sleep 10 && echo "hello world" &

bedeutet, dass Sie das Ende des Ruhezustands abwarten müssen, bevor Sie etwas wiederholen. Wenn das Echo fehlschlägt, wird der Prozess gestoppt, aber der gesamte Befehl wird ebenfalls im Hintergrund ausgeführt. siehe vollständige Erklärung

Fazit
Die erste Syntax ist ein Shell-Skript, was bedeutet, dass Anweisungen separat als Liste betrachtet werden.
Die zweite Option verwendet && bedeutet UND. Wenn Sie sie verwenden, wenn der erste Befehl fehlschlägt, wird der zweite nicht ausgeführt.

Dies ist nur ein anderes Verhalten bei der Behandlung von Fehlern.

Kiwy
quelle
@terdon Danke für die Bearbeitung, mein Beitrag wurde in der Tat schrecklich geschrieben
Kiwy