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.
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? Czyset -e
włączyłeś? Czy 2. i 3. polecenie polegają na czymś, co zapewnia 1.? Czy wystąpił jakiś błąd? Musisz podać więcej informacji.Odpowiedzi:
W ten sposób możesz nieznacznie zmodyfikować skrypt
Uwaga:
bash
przechowuje$?
. To jest,0
jeś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śmyexit_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,$c
nie równa się0
zwrotom 1.#!/bin/bash
aby powiedzieć systemowi, że jest to skrypt, który musi zostać wykonany wbash
powłoce.Interesujące może być przeczytanie więcej o shebang tutaj.
set -e
gdzieś 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).źródło