W bash
czasem czasami chcę uruchamiać kilka poleceń szeregowo i nie chcę czekać na ich zakończenie przed wpisaniem nowych. Więc robię coś takiego:
cmd1; cmd2; cmd3
Niestety jedno z poleceń może się nie powieść. W takim razie chciałbym przestać. Czy istnieje prosty sposób, aby to zrobić, ale sprawię, że będę uruchamiał polecenia tylko wtedy, gdy poprzednie polecenie miało kod wyjścia 0?
command-line
bash
metafora pytoniczna
źródło
źródło
Odpowiedzi:
Użyj
&&
operatora,W shellscripting,
&&
oraz||
operatorzy wzorowane optymalnej realizacji operatorów logicznych C.&&
Sposób i operatora i||
środki lub. Uniks jest ściśle powiązany z C, aw C drugi operand operatorów logicznych nie jest oceniany, jeśli wynik jest już znany z pierwszego operandu. Np."false && x"
Jestfalse
dla każdegox
, więc nie ma potrzeby ocenianiax
(zwłaszcza jeślix
jest to wywołanie funkcji); podobnie dla"true || x"
. Nazywa się to również semantyką zwarć .A w Uniksie tradycyjnie interpretuje się zwracane wartości poleceń jako wartości „pomyślnego zakończenia”: kod wyjścia 0 oznacza
true
(sukces), niezerowy oznaczafalse
(niepowodzenie). Tak więc, gdy pierwsze poleceniecmd1 && cmd2
wróci"false"
(niezerowy status wyjścia, co wskazuje na niepowodzenie), status polecenia złożonego jest znany: błąd. Tak więc ogólna interpretacjacmd1 && cmd2
może być następująca: „wykonajcmd1
, A NASTĘPNIE, jeśli się nie powiedziecmd2
”. Tego właśnie chcesz w swoim pytaniu.Podobnie z OR:
cmd1 || cmd2
można interpretować jako „wykonajcmd1
, LUB JEŚLI się nie powiedziecmd2
”.Protip: w przypadku dłuższych łańcuchów
&&
rozważ umieszczenieset -e
skryptu. Zasadniczo zmienia średnik;
na&&
, z kilkoma specjalnymi przypadkami.źródło
||
A || B
jest tak samo jak [zwarcie] logicznej A lub B .A || B
jest sukcesem, kiedyA
był sukcesem lub kiedyA
był porażką, aleB
był sukcesem ; iA || B
jest porażką, kiedyA
była porażką iB
byłafailure
. Podobnie&&
wynika z logicznego AND.;
(lub nowy wiersz).set -e
okaże;
się&&
, z grubsza rzecz biorąc.set +e
[domyślnie] zmienia sięA; B
w to, co mówisz: biegnijA
, a potem nieważne, co biegnieszB
.„Łączenie łańcuchowe poleceń i grupowanie ich”
ping, tylko jeśli się nie powiedzie, wykonuje łańcuchową grupę poleceń w nawiasach.
Uwaga:
Lista musi być zakończona znakiem „;”.
Pomiędzy nawiasami i pogrupowanymi poleceniami muszą znajdować się spacje!
źródło
Po prostu z
&&
operatorem. Na przykład:Jeśli jedno z poleceń nie powiedzie się (zwraca wartość wyjścia inną niż 0), pozostałe polecenia nie będą działać.
źródło