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?


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.


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!


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ć.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.