wiersz poleceń - do czego służy &&
?
W skorupce, kiedy widzisz
$ command one && command two
celem jest wykonanie polecenia następującego po tym, &&
tylko jeśli pierwsze polecenie zakończy się powodzeniem. Jest to idiomatyczne dla pocisków Posix i nie tylko w Bash.
Ma to na celu zapobieganie uruchomieniu drugiego procesu, jeśli pierwszy się nie powiedzie.
Możesz zauważyć, że użyłem słowa „zamiar” - to nie bez powodu. Nie wszystkie programy zachowują się tak samo, więc aby to zadziałało, musisz zrozumieć, co program uważa za „awarię” i jak sobie z tym poradzić, czytając dokumentację i, w razie potrzeby, kod źródłowy.
Twoja powłoka przyjmuje wartość zwracaną 0 dla wartości true, a inne liczby dodatnie dla wartości false
Programy zwracają sygnał przy wychodzeniu. Powinny zwrócić 0, jeśli zakończą się pomyślnie, lub większą od zera, jeśli nie. Umożliwia to ograniczoną komunikację między procesami.
&&
Się dalej AND_IF
w gramatyki POSIX powłoki , która jest częścią and_or
listy rozkazów, które należą również ||
która jest OR_IF
o podobnej semantyki.
Symbole gramatyczne cytowane z dokumentacji:
%token AND_IF OR_IF DSEMI
/* '&&' '||' ';;' */
I gramatyka (cytowana również z dokumentacji), która pokazuje, że dowolną liczbę AND_IF
s ( &&
) i / lub OR_IF
s ( ||
) można łączyć razem (zgodnie z and_or
definicją rekurencyjną):
and_or : pipeline
| and_or AND_IF linebreak pipeline
| and_or OR_IF linebreak pipeline
Oba operatory mają jednakowe pierwszeństwo i są oceniane od lewej do prawej (są one skojarzone). Jak mówią doktorzy:
AND-OR
Lista sekwencji jednej lub więcej rur, oddzielonych przez operatorów "&&"
i "||"
.
Lista jest sekwencja z jednego lub więcej i, lub listy oddzielone przez operatorów ';'
i '&'
ewentualnie zakończone ';'
, '&'
lub.
Operatorzy "&&"
i "||"
mają równy priorytet i będą oceniani z pozostawionym skojarzeniem. Na przykład oba poniższe polecenia zapisują wyłącznie pasek na standardowe wyjście:
$ false && echo foo || echo bar
$ true || echo foo && echo bar
W pierwszym przypadku false to polecenie kończące się ze statusem 1
$ false
$ echo $?
1
co oznacza, echo foo
że nie działa (tj. zwarcie echo foo
). Następnie polecenie echo bar
jest wykonywane.
W drugim przypadku true kończy działanie z kodem 0
$ true
$ echo $?
0
i dlatego echo foo
nie jest wykonywany, a następnie echo bar
wykonywany.
false && echo "Will not be printed"
.