Soweit ich weiß, ist die Verwendung von &
nach dem Befehl ist für die Ausführung im Hintergrund.
Beispiel für &
Verwendung: tar -czf file.tar.gz dirname &
Aber wie wäre es mit &&
? ( Beispiel )
Soweit ich weiß, ist die Verwendung von &
nach dem Befehl ist für die Ausführung im Hintergrund.
Beispiel für &
Verwendung: tar -czf file.tar.gz dirname &
Aber wie wäre es mit &&
? ( Beispiel )
Darüber hinaus haben Sie auch ||
was das logische Oder ist, und auch ;
was nur ein Trennzeichen ist, das sich nicht darum kümmert, was mit dem Befehl davor passiert ist.
$ false || echo "Oops, fail"
Oops, fail
$ true || echo "Will not be printed"
$
$ true && echo "Things went well"
Things went well
$ false && echo "Will not be printed"
$
$ false ; echo "This will always run"
This will always run
Einige Details dazu finden Sie hier Listen von Befehlen im Bash-Handbuch.
Kommandozeile - was ist der Zweck von
&&
?
In der Shell, wenn Sie sehen
$ command one && command two
ist die Absicht, den Befehl auszuführen, der auf den Befehl &&
nur, wenn der erste Befehl erfolgreich ist. Dies ist typisch für Posix-Shells und nicht nur in der Bash zu finden.
Es soll verhindern, dass der zweite Prozess läuft, wenn der erste fehlschlägt.
Sie haben vielleicht bemerkt, dass ich das Wort "Absicht" verwendet habe - und das hat seinen guten Grund. Nicht alle Programme verhalten sich gleich. Damit dies funktioniert, müssen Sie verstehen, was das Programm als "Fehler" ansieht und wie es damit umgeht, indem Sie die Dokumentation und, falls nötig, den Quellcode lesen.
Programme geben eine Signal beim Verlassen. Sie sollten 0 zurückgeben, wenn sie erfolgreich beendet werden, oder größer als Null, wenn sie nicht beendet werden. Dies ermöglicht eine begrenzte Menge an Kommunikation zwischen Prozessen.
Le site &&
wird bezeichnet als AND_IF
im Posix-Shell-Grammatik die Teil eines and_or
Liste von Befehlen, zu denen auch die ||
die ein OR_IF
mit ähnlicher Semantik.
Grammatiksymbole, zitiert aus der Dokumentation:
%token AND_IF OR_IF DSEMI /* '&&' '||' ';;' */
Und die Grammatik (ebenfalls aus der Dokumentation zitiert), die zeigt, dass eine beliebige Anzahl von AND_IF
s ( &&
) und/oder OR_IF
s ( ||
) können aneinandergereiht werden (als and_or
rekursiv definiert ist):
and_or : pipeline | and_or AND_IF linebreak pipeline | and_or OR_IF linebreak pipeline
Beide Operatoren haben den gleichen Vorrang und werden von links nach rechts ausgewertet (sie sind links-assoziativ). Wie die Dokumentation sagt:
Eine
AND-OR
Liste ist eine Folge von einer oder mehreren Pipelines, die durch das Zeichen Operatoren"&&"
y"||"
.Eine Liste ist eine Folge von einer oder mehreren AND-OR-Listen, die durch das Zeichen Operatoren
';'
y'&'
und optional beendet durch';'
,'&'
. oder .Die Betreiber
"&&"
y"||"
haben den gleichen Vorrang und sind mit linker Assoziativität ausgewertet werden. Zum Beispiel schreiben beide der folgenden Befehle schreiben ausschließlich bar auf die Standardausgabe:$ false && echo foo || echo bar $ true || echo foo && echo bar
Im ersten Fall ist "false" ein Befehl, der mit dem Status 1
$ false
$ echo $?
1
was bedeutet echo foo
läuft nicht (d.h. Kurzschluss echo foo
). Dann wird der Befehl echo bar
ausgeführt wird.
Im zweiten Fall verlässt true mit einem Code von 0
$ true
$ echo $?
0
und daher echo foo
nicht ausgeführt wird, dann echo bar
ausgeführt wird.
Eine recht häufige Verwendung für '&&' ist das Kompilieren von Software mit Autotools. Zum Beispiel:
./configure --prefix=/usr && make && sudo make install
Wenn configure erfolgreich ist, wird make ausgeführt, um zu kompilieren, und wenn das erfolgreich ist, wird make als Root ausgeführt, um das Programm zu installieren. Ich verwende dies, wenn ich mir weitgehend sicher bin, dass die Dinge funktionieren werden, und es erlaubt mir, andere wichtige Dinge zu tun, wie z.B. auf Stackoverflow zu schauen und den Fortschritt nicht zu "überwachen".
Manchmal lasse ich mich wirklich hinreißen...
tar xf package.tar.gz && ( cd package; ./configure && make && sudo make install ) && rm package -rf
Ich mache das zum Beispiel, wenn ich eine Linux-Box von Grund auf neu aufbaue.
&&
reiht Befehle aneinander. Aufeinanderfolgende Befehle werden nur ausgeführt, wenn die vorhergehenden erfolgreich waren.
Ähnlich, ||
ermöglicht die Ausführung des nachfolgenden Befehls, wenn der vorhergehende fehlschlägt.
Véase Bash-Shell-Programmierung .
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.