Ja, es gibt einen großen Unterschied. &&
ist kurzgeschlossen , daher würde der nachfolgende Befehl nur ausgeführt, wenn der vorherige mit einem Exit-Code von zurückgegeben würde 0
.
Zitat aus dem Handbuch :
Ausdruck1 &&
Ausdruck2
True if both expression1 and expression2 are true.
Auf der anderen Seite enthält ein Skript
expression1
expression2
würde den zweiten Ausdruck ausführen, selbst wenn der erste fehlschlägt. (Es sei denn, Sie haben das Skript angegeben, das bei einem Fehler beendet werden soll set -e
.)
EDIT: In Bezug auf Ihren Kommentar, ob:
command1; command2
ist das gleiche wie:
command1
command2
Die Antwort ist normalerweise . Bash analysiert einen gesamten Anweisungsblock, bevor einer davon ausgewertet wird. EIN ; bewirkt nicht, dass der vorherige Befehl ausgewertet wird. Wenn sich der vorherige Befehl darauf auswirken würde, wie der nachfolgende analysiert wird, würden Sie den Unterschied bemerken.
Stellen Sie sich eine Datei vor, die Aliase enthält, und rufen Sie sie alias
mit einem Eintrag auf:
alias f="echo foo"
Betrachten Sie nun ein Skript, das Folgendes enthält:
shopt -s expand_aliases
source ./alias
f
und eine andere mit:
shopt -s expand_aliases; source ./alias; f
dann könnten Sie denken, dass beide die gleiche Ausgabe erzeugen würden.
Die Antwort ist nein. Der erste würde produzieren, foo
aber der zweite würde berichten:
... f: command not found
Zur weiteren Klärung ist es nicht expand_aliases
das Problem. Das Problem ist auf die Tatsache zurückzuführen, dass eine Aussage wie:
alias f="echo foo"; f
würde auf einmal analysiert werden . Die Shell weiß nicht wirklich, was f
ist, dies führt dazu, dass der Parser erstickt.