Jak łączyć polecenia z konsoli?

23

W bashczasem 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?

metafora pytoniczna
źródło
Oto świetna odpowiedź od Unix SE.
NielinioweOwoc

Odpowiedzi:

39

Użyj &&operatora,

cmd1 && cmd2 && cmd3

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"Jest falsedla każdego x, więc nie ma potrzeby oceniania x(zwłaszcza jeśli xjest 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 oznacza false(niepowodzenie). Tak więc, gdy pierwsze polecenie cmd1 && cmd2wróci "false"(niezerowy status wyjścia, co wskazuje na niepowodzenie), status polecenia złożonego jest znany: błąd. Tak więc ogólna interpretacja cmd1 && cmd2 może być następująca: „wykonaj cmd1, A NASTĘPNIE, jeśli się nie powiedzie cmd2”. Tego właśnie chcesz w swoim pytaniu.

Podobnie z OR: cmd1 || cmd2można interpretować jako „wykonaj cmd1, LUB JEŚLI się nie powiedzie cmd2”.


Protip: w przypadku dłuższych łańcuchów &&rozważ umieszczenie set -eskryptu. Zasadniczo zmienia średnik ;na &&, z kilkoma specjalnymi przypadkami.

ulidtko
źródło
1
+1 za wyjaśnienie||
Alp
czy możesz połączyć łańcuch niezależnie od statusu pierwszego polecenia? (sukces lub porażka)
Hugo Trentesaux
@HugoTrentesaux co masz na myśli? .. powodzenia / niepowodzenia lub rezultat A || Bjest tak samo jak [zwarcie] logicznej A lub B . A || Bjest sukcesem, kiedy Abył sukcesem lub kiedy Abył porażką, ale Bbył sukcesem ; i A || Bjest porażką, kiedy Abyła porażką i Bbyła failure. Podobnie &&wynika z logicznego AND.
ulidtko
W kontekście powłoki, jak mogę wykonać A, a następnie B, niezależnie od tego, czy A się powiedzie, czy odniesie sukces?
Hugo Trentesaux
1
@ HugoTrentesaux domyślnie robi to zwykły zwykły ;(lub nowy wiersz). set -eokaże ;się &&, z grubsza rzecz biorąc. set +e[domyślnie] zmienia się A; Bw to, co mówisz: biegnij A, a potem nieważne, co biegniesz B.
ulidtko
13

„Łączenie łańcuchowe poleceń i grupowanie ich”

ping 192.168.0.1 || { echo "ping not successful"; exit 1; }

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!

i ja
źródło
6

Po prostu z && operatorem. Na przykład:

cmd1 && cmd2 && cmd3

Jeśli jedno z poleceń nie powiedzie się (zwraca wartość wyjścia inną niż 0), pozostałe polecenia nie będą działać.

Wuffers
źródło