Gibt es einen Unterschied zwischen der Funktionsweise von zwei Et-Zeichen und einem Semikolon in Bash?

71

Wenn ich zwei separate Befehle in einer Zeile ausführen wollte, könnte ich dies tun:

cd /home; ls -al

oder dieses:

cd /home && ls -al

Und ich bekomme die gleichen Ergebnisse. Was passiert mit diesen beiden Methoden im Hintergrund? Was ist der funktionale Unterschied zwischen ihnen?

Sean P
quelle

Antworten:

88

Das ;trennt nur einen Befehl von einem anderen. Der &&Befehl wird nur ausgeführt, wenn der vorherige erfolgreich war

cd /home; ls -al

Dies wird ausgeführt, cd /homeund selbst wenn der cdBefehl fehlschlägt ( /homenicht vorhanden, Sie haben keine Berechtigung, ihn zu durchlaufen usw.) ls -al.

cd /home && ls -al

Dies wird nur ausgeführt, ls -alwenn das cd /homeerfolgreich war.

user9517
quelle
2
; Zum Beispiel ist die Verwendung von ein sehr gefährlicher Befehl (zumindest mit dem Befehl rm) cd /some/dir; rm -fr ./*. Bei solch einer destruktiven Operation müssen Sie also sicherstellen, dass Sie am richtigen Ort sind, bevor Sie rm ausführen. Der richtige Befehl lautetcd /some/dir && rm -fr ./*
ALex_hha
70
a && b

Gibt a einen Exit-Code von Null zurück, wird b ausgeführt.

a || b

Wenn a einen Exit-Code ungleich Null zurückgibt, wird b ausgeführt.

a ; b

a wird ausgeführt und dann wird b ausgeführt.

Minsuk Song
quelle
16
cd /fakedir; ls -al

Wird lsim aktuellen Verzeichnis ausgeführt, da dies cd /fakedirfehlschlägt und die Shell den Exit-Status ignoriert, der ungleich Null ist.

cd /fakedir && ls -al

Da der &&Bediener nur fortfährt, wenn der vorherige Befehl normal beendet wurde (Status Null), wird keine lsOperation ausgeführt.

Es gibt andere Operatoren, die beispielsweise &einen Prozess im Hintergrund ausführen. Obwohl es oft am Ende eines Befehls steht, kann es in die Mitte einer Kette gestellt werden.

Jeff Ferland
quelle
4

Sie können sie auch wie eine if..then..elseBefehlslogik zum Verketten zusammenfügen.

Beispiel:

ls file.ext && echo "file exists" || echo "file does not exist"
Mtl Dev
quelle