Frage Gibt es einen Unterschied zwischen zwei Ampersands und einem Semikolon in bash?


Wenn ich zwei separate Befehle in einer Zeile ausführen möchte, könnte ich Folgendes tun:

cd /home; ls -al

oder dieses:

cd /home && ls -al

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


66
2018-03-24 20:51


Ursprung




Antworten:


Das ; trennt nur einen Befehl von einem anderen. Das && sagt nur den folgenden Befehl ausführen, wenn der vorherige erfolgreich war

cd /home; ls -al

Dieser Wille cd /home und selbst wenn die cd Befehl schlägt fehl (/home existiert nicht, du hast keine Erlaubnis es zu durchlaufen, etc.), es wird laufen ls -al.

cd /home && ls -al

Dies wird nur ausgeführt ls -al wenn die cd /home war erfolgreich.


84
2018-03-24 20:58



Verwendung von ;  ist ein wirklich gefährlicher (zum Beispiel mit rm Befehl), zum Beispiel cd /some/dir; rm -fr ./*. Bei einer solchen destruktiven Operation müssen Sie sicher sein, dass Sie sich an der richtigen Stelle befinden, bevor Sie rm ausführen. Der richtige Befehl ist cd /some/dir && rm -fr ./* - ALex_hha


a && b

ob ein Gibt dann null Exit-Code zurück b wird ausgeführt.

a || b

ob ein Gibt dann einen Nicht-Null-Beendigungscode zurück b wird ausgeführt.

a ; b

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


68
2018-03-26 01:50





cd /fakedir; ls -al

Läuft ls im aktuellen Verzeichnis weil cd /fakedir wird fehlschlagen und die Shell ignoriert den Exit-Status, der nicht Null ist.

cd /fakedir && ls -al

Weil der && Der Operator wird nur fortgesetzt, wenn der vorherige Befehl normal beendet wurde (Status von Null), nein ls Operation wird ausgeführt.

Es gibt andere Betreiber, wie z & welches Hintergrund ein Prozess wird. Während es oft am Ende eines Befehls platziert wird, kann es in der Mitte einer Kette platziert werden.


15
2018-03-24 21:00





Sie können sie auch zusammen wie ein verbinden if..then..else zum Verketten der Befehlslogik.

Beispiel:

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

3
2018-03-08 08:32