Bash / sh - Unterschied zwischen && und;

136

Normalerweise ;kombiniere ich mehr als einen Befehl in einer Zeile, aber einige Leute bevorzugen &&. Gibt es einen Unterschied? Zum Beispiel cd ~; cd -und cd ~ && cd -scheint das Gleiche zu machen. Welche Version ist portabler, z. B. wird sie von einer Bash-Teilmenge wie der Android-Shell oder so unterstützt?

Psihodelia
quelle

Antworten:

193

Wenn der vorherige Befehl mit ;dem zweiten fehlgeschlagen ist, wird ausgeführt.

Aber mit &&dem zweiten läuft man nicht.

Dies ist ein "fauler" logischer "UND" -Operand zwischen Operationen.

Ignar
quelle
2
Mit anderen Worten, es hat ein Kurzschlussverhalten
Peterchaula
@ Peter Welches? Der ;eine oder der &&eine? Oder meinst du beides?
Shayan
@ Shayan, der &&.
Peterchaula
57

Ich benutze &&da vor langer Zeit am nahe gelegenen Computer:

root# pwd
/
root# cd /tnp/test; rm -rf *
cd: /tnp/test: No such file or directory
...
... and after a while ...
...   
^C

aber nicht geholfen ...;)

cd /tnp/test && rm -rf * ist sicher... ;)

jm666
quelle
26
Um sicherer zu sein, würde ichrm -rf /tnp/test
melvynkim
5
Um noch sicherer zu sein, ist es besser, um rm /tnp/test/ -rfzu verhindern, dass tödliche Fehlklicks eintreten
Radrow
22

In cmd1 && cmd2, cmd2wird nur ausgeführt , wenn cmd1erfolgreich ist (0 zurück).

In cmd1 ; cmd2, cmd2wird in jedem Fall ausgeführt.

Beide Konstrukte sind Teil einer POSIX-kompatiblen Shell.

Pascal Cuoq
quelle
11

&&bedeutet, den nächsten Befehl auszuführen, wenn der vorherige mit dem Status 0 beendet wurde. Im Gegenteil, verwenden Sie ||dh, um ausgeführt zu werden, wenn der vorherige Befehl mit einem Status ungleich 0 beendet ;wird.

Sehr nützlich, wenn Sie eine bestimmte Aktion ausführen müssen, je nachdem, ob der vorherige Befehl OK ist oder nicht.

Fredrik Pihl
quelle
5

Befehle, die durch getrennt ;sind, werden unabhängig von ihrem Abschlussstatus nacheinander ausgeführt.

Mit &&wird der zweite Befehl nur ausgeführt, wenn der erste erfolgreich abgeschlossen wurde (gibt den Exit-Status 0 zurück).

Dies wird in der Bash-Manpage unter behandelt Lists. Ich würde erwarten, dass jede Unix-ähnliche Shell diese beiden Operatoren unterstützt, aber ich weiß nicht speziell über die Android-Shell Bescheid.

Dave Costa
quelle
2
Hier ist ein Link zum Bash-Handbuch: gnu.org/software/bash/manual/bashref.html#Lists
Glenn Jackman
3

&&ermöglicht die bedingte Ausführung, während ;immer der zweite Befehl ausgeführt wird.

In Beispiel command1 && command2, command2wird nur ausgeführt werden, wenn command1mit Beendigung exit 0signalisiert alles gut gegangen ist, während in command1 ; command2dem zweiten Befehl wird unabhängig davon immer dann ausgeführt werden , was das Ergebnis war command1.

Marcel
quelle
1

&& ist logisch UND in Bash. Bash hat eine Kurzschlussauswertung des logischen UND. Diese Redewendung ist eine einfachere Möglichkeit, Folgendes auszudrücken:


cmd1;rc=$?
if [ $rc -eq 0 ]; then
   cmd2
fi

Während die ; Version ist nur:


cmd1
cmd2
frankc
quelle