Was ist der Unterschied zwischen "Befehl && Befehl" und "Befehl; Befehl"

49

Ich sehe diese beiden Verwendungszwecke auf Ubuntu "Befehl && Befehl" und "Befehl; Befehl",
zapt-get update && apt-get upgrade

Was würde anders sein, wenn ich benutze apt-get update; apt-get upgrade?
Ich frage nicht nach dieser spezifischen Verwendung, aber was ist im Allgemeinen der Unterschied zwischen diesen beiden Verwendungen?

Übelsuppe
quelle
2
Win Befehlszeile und Batch haben die gleiche Funktion: & (simple sequencing), && (conditional AND) and || (conditional OR).
Karan
5
Siehe auch: Bash-Referenzhandbuch - Liste der Befehle . Im Allgemeinen gibt es nichts, was Sie in der Dokumentation nicht finden können. Es lohnt sich wirklich, nachzusehen, wenn Sie eine Frage zu bestimmten Syntaxelementen haben.
Slhck
1
@ Karan Und der Vollständigkeit halber hat Bash (Linux / Ubuntu) ||auch.
Izkata

Antworten:

88

&&ist ein logischer Operator. ;ist eine einfache Sequenzierung.

In cmd1 && cmd2wird cmd2 nur ausgeführt, wenn cmd1 mit einem erfolgreichen Rückkehrcode beendet wird.

Während in cmd1; cmd2, wird cmd2 unabhängig vom Exit-Status von cmd1 ausgeführt (vorausgesetzt, Sie haben Ihre Shell nicht so eingestellt, dass sie bei allen Fehlern in Ihrem Skript oder so etwas beendet wird).

Aus einem ähnlichen Grund wird cmd2 cmd1 || cmd2mit dem ||logischen Operator 'OR' nur ausgeführt, wenn cmd1 fehlschlägt (ein Exit-Code ungleich Null wird zurückgegeben).

Diese logischen Operatoren werden manchmal in Skripten anstelle einer einfachen if-Anweisung verwendet. Zum Beispiel,

if [[ -f "$foo" ]]; then mv "$foo" "${foo%.txt}.mkd"; fi

... lässt sich prägnanter erreichen mit:

[[ -f "$foo" ]] && mv "$foo" "${foo%.txt}.mkd"
Etan Reisner
quelle
Ich finde es ein bisschen trügerisch, weil nach meinem Verständnis der erfolgreiche Rückkehrcode 0 bedeutet, was, wenn es in bool umgewandelt wird, ein logisches Falsch ergibt. Entsprechend der Philosophie der Mccarthy-Bewertung, die in den meisten Sprachen verwendet wird, sollte sie sofort false zurückgeben, anstatt die nächste Anweisung zu bewerten (auszuführen).
Della
33

Syntax

command1 && command2

Befehl2 wird nur dann ausgeführt, wenn der Beendigungsstatuscommand1 Null ( true )lautet. Führencommand1Sie mitanderen Worten aus,und führen Sie dann aus,wenn es erfolgreich istcommand2.

command1 ; command2

Sowohl Befehl1 als auch Befehl2 werden unabhängig voneinander ausgeführt. Mit dem Semikolon können Sie viele Befehle in einer Zeile eingeben.

Verwandte :

command1 || command2

Befehl2 wird nur dann ausgeführt, wenn Befehl1 einen Exit-Status ungleich Null zurückgibt. Führen Sie mit anderen Wortencommand1erfolgreich aus oder führen Sie auscommand2.


Beispiel

&& Operator:

$ rm /tmp/filename && echo "File deleted"

; Operator:

$ echo "foo" ; echo "bar"

|| Operator:

$ cat /tmp/filename 2>/dev/null || echo "Failed to open file"

Externe Links

  1. Linuxtopia.org
  2. Tldp.org
stderr
quelle