Jak uruchomić wiele skryptów w skrypcie, nawet jeśli jeden skrypt zawiedzie

0

Mam prosty skrypt bash, który wykonuje wiele innych skryptów…

#/bin/bash

./update_artifact1.sh $ARTIFACT_VERSION
./update_artifact2.sh $ARTIFACT_VERSION
./update_artifact3.sh $ARTIFACT_VERSION

Problem polega na tym, że jeśli pierwsze (lub drugie) polecenie umrze z błędem, żadne z kolejnych poleceń nie zostanie uruchomione. Czy istnieje sposób na uruchomienie wszystkich trzech poleceń, zapisanie statusu wyjścia każdego z nich, a następnie zwrócenie pomyślnego statusu wyjścia, jeśli wszystkie trzy zostaną wykonane pomyślnie? Skrypty nie muszą działać jednocześnie.

Dave
źródło
2
To, co pokazujesz, nie oznacza, że ​​główny skrypt powinien umrzeć. Co kryje się za „…”?
glenn jackman
Jeśli polecenie „./update_artifact1.sh $ ARTIFACT_VERSION” nie powiedzie się, pozostałe dwa polecenia („./update_artifact2.sh $ ARTIFACT_VERSION” i „./update_artifact3.sh $ ARTIFACT_VERSION”) nie działają. Czy rozumiesz?
Dave
3
tak. Ale jeśli spróbujesz cd /unknown_dir; echo ok, polecenie echa zostanie wykonane, nawet jeśli cd nie powiedzie się. Dlaczego 2. i 3. polecenie nie działają w twoim skrypcie? Czy set -ewłączyłeś? Czy 2. i 3. polecenie polegają na czymś, co zapewnia 1.? Czy wystąpił jakiś błąd? Musisz podać więcej informacji.
glenn jackman

Odpowiedzi:

0

W ten sposób możesz nieznacznie zmodyfikować skrypt

#!/bin/bash

./update_artifact1.sh $ARTIFACT_VERSION
exit_state_1=$?
./update_artifact2.sh $ARTIFACT_VERSION
exit_state_2=$?
./update_artifact3.sh $ARTIFACT_VERSION
exit_state_3=$?
exit_state_all=$[ $exit_state_1 &&  $exit_state_2 && $exit_state_3 ]
exit $exit_state_all

Uwaga:

  • Każde polecenie zwraca kod wyjścia, który bashprzechowuje $?. To jest, 0jeśli nie ma błędu, lub inny numer, jeśli występuje błąd.
    Po każdym wierszu wartość parametru $?jest aktualizowana, dlatego należy przechowywać w zmiennej (w tym przypadku użyliśmy exit_state_1... exit_state_n).
    Na koniec chcesz, aby skrypt zwrócił Ci tylko kod błędu z 0, jeśli wszystko jest w porządku, a my to zrozumiemy $[ $a || $b || $c ].
    Zauważ, że w $[ 0|| 0 || 0 ]międzyczasie wynosi 0, $[ $a || $b || $c ]przy czym co najmniej jeden $a,$b,$cnie równa się 0zwrotom 1.
  • Ważne jest, aby ! w pierwszym wierszu, gdy musisz napisać, #!/bin/bashaby powiedzieć systemowi, że jest to skrypt, który musi zostać wykonany w bashpowłoce.
    Interesujące może być przeczytanie więcej o shebang tutaj.
  • Jak zauważono również w komentarzu, jeśli umieścisz set -egdzieś w skrypcie przed tym wierszem, skrypt zostanie przerwany przy pierwszym błędzie bez przetworzenia drugiego wiersza i zwróci kod błędu (ten z ostatniego wykonanego polecenia).
Hastur
źródło