Antworten:
Ja, und Sie können es ganz einfach selbst überprüfen:
$ non-existent-command && echo hi ; echo after semicolon
bash: non-existent-command: command not found
after semicolon
Darin man bash
steht:
Befehle getrennt durch a; werden nacheinander ausgeführt; Die Shell wartet darauf, dass jeder Befehl nacheinander beendet wird.
commandC
wird ausgeführt, egal ob commandA
odercommandB
fehlschlägt oder erfolgreich ist.
Semikolon ist nur ein Trennzeichen, mit dem Befehle nacheinander ausgeführt werden können. Das Szenario nur , dass ich kann sehen , wo commandC
fehlschlagen, ist , wenn commandA
oder commandB
sind exit
Befehle (oder irgendein Befehl wie return
/ break
/ continue
/exec
(oder Funktionen , die diejenigen nennen) das wirkt sich gewaltsam den Arbeitsablauf):
Szenario 1: commandA
istexit
[root@host ~]# exit && echo "HI"; echo "test"
logout
[user@host ~]$
Szenario 2: commandB
istexit
[root@host~]# echo "HI" && exit; echo "test"
HI
logout
[user@host ~]$
tl; dr: Ist das nicht so, dass diese Zeichen Vorrang haben? Sie bedeuten verschiedene Dinge. Einer ist ein logischer Operator und der andere ist ein Listenabschluss.
Verwandte Sachen:
Was sind die Steuerungs- und Umleitungsoperatoren der Shell? Diese Antwort gibt eine gute Erklärung für die Bash-Operatoren. Ein kleines Stück der Antwort zitieren:
;
: Führt einen Befehl nach dem anderen aus, unabhängig vom Ergebnis des ersten.command1 ; command2
Zuerst
command1
wird im Vordergrund ausgeführt, und sobald es fertig ist,command2
wird es ausgeführt.Eine neue Zeile, die nicht in einem Zeichenfolgenliteral oder nach bestimmten Schlüsselwörtern steht , entspricht nicht dem Semikolonoperator. Eine Liste mit
;
begrenzten einfachen Befehlen ist immer noch eine Liste - wie im Parser der Shell müssen die einfachen Befehle, die einem;
begrenzten einfachen Befehl folgen, vor der Ausführung weiterhin eingelesen werden , während eine neue Zeile eine gesamte Befehlsliste oder Liste von Listen begrenzen kann. Der Unterschied ist subtil, aber kompliziert: Da die Shell keine vorherige Notwendigkeit zum Einlesen von Daten nach einer neuen Zeile hat, markiert die neue Zeile einen Punkt, an dem die Shell beginnen kann, die einfachen Befehle auszuwerten, die sie bereits eingelesen hat, während ein;
Semikolon dies tut nicht.
Semikolons am Ende einer Zeile in Shell-Skripten überflüssig? Zitiert die Antwort:
Einzelne Semikolons am Ende einer Zeile sind überflüssig, da die neue Zeile auch ein Befehlstrennzeichen ist.
case
benötigt speziell doppelte Semikolons am Ende des letzten Befehls in jedem Musterblock; siehehelp case
für Details.
Was ist der Unterschied zwischen Semikolon und doppeltem kaufmännischem Und &&
&&
(und ||
) haben eine höhere Priorität als ;
(und |
). Was meinst du mit "Einer dient zum Vergleich und der andere soll abgrenzen, wo der nächste Befehl in einer Liste von Befehlen beginnen wird (Steueroperator)."? Sie sind alle Steuerungsoperatoren; Sie alle begrenzen einfache Befehle.
;
sie unabhängig vom Ergebnis dessen, was noch übrig ist, ausgeführt werden. Es ist ein Trennzeichen wie newline
bei Shell-Skripten, und sein Lesen ähnelt irgendwie dem natürlichen Lesen: erste Befehlszeilensequenz ;
zweite Befehlszeilensequenz ;
dritte Befehlszeilensequenz ;
usw.
Wie andere Beiträge bereits sagten, lautet die kurze Antwort "Ja, commandC
wird ausgeführt, unabhängig davon, was sonst noch passiert."
Wie nwildner untersucht hat , lautet die längere Antwort: „Ja, commandC
wird ausgeführt, unabhängig davon, was sonst noch passiert, solange sich die Shell noch in einem Zustand befindet, in dem sie ausgeführt werden kann commandC
. Mit anderen Worten, die Shell wird nicht über das hinausgehen
commandA && commandB ; command
Befehlszeile ohne Ausführung commandC
. "
Wenn commandA
(oder commandB
) kill -KILL $$
etwas anderes ist, das die Shell beendet oder lähmt oder den Befehlsfluss stört, commandC
wird es nicht ausgeführt. (Es handelt sich hier eindeutig um Randfälle.) Das Verhalten ist etwas anders, wenn set -e
(oder gleichwertig set -o errexit
) Folgendes ausgegeben wurde:
commandA
fehlschlägt, commandC
wird es ausgeführt (wird es aber commandB
nicht sein).commandA
erfolgreich ist, commandB
wird es ausgeführt.
commandB
erfolgreich ist, commandC
wird es ausgeführt.commandB
nicht, wird die Shell verlassen, und commandC
wird nicht ausgeführt werden.Die errexit
Option gibt an, dass die Shell beendet werden soll, wenn ein Befehl (eine „Pipeline“) fehlschlägt, mit einigen Ausnahmen:
Die Shell wird nicht beendet, wenn der fehlgeschlagene Befehl Teil der Befehlsliste ist, die unmittelbar auf ein
while
oder einuntil
Schlüsselwort folgt , Teil des Tests, der denif
oderelif
reservierten Wörtern folgt , Teil eines Befehls, der in einer&&
oder||
-Liste ausgeführt wird, mit Ausnahme des Befehls, der auf das letzte&&
oder ein||
beliebiges folgt Befehl in einer Pipeline, aber der letzte, oder wenn der Rückgabewert des Befehls mit invertiert wird!
.- von Bash (1)
Wenn dies commandA
fehlschlägt, wird dies nur commandB
nicht ausgeführt, da commandA
gefolgt wird &&
. Wenn es jedoch ausgeführt wird commandB
und fehlschlägt, wird die Shell beendet, da es ( commandB
) dem (final) folgt &&
.
commandB
undcommandC
(wenn escommandA
in Ordnung ist), schreibencommandA && (commandB ; commandC )