Biorąc słowo „ każde polecenie zależy od każdego poprzedniego polecenia. Jeśli któreś polecenie zawiedzie, cały skrypt powinien zawieść ” dosłownie, myślę, że nie potrzebujesz żadnej specjalnej funkcji do leczenia błędów.
Wystarczy połączyć swoje polecenia z &&
operatorem i ||
operatorem, który robi dokładnie to, co napisałeś.
Na przykład ten łańcuch się zepsuje i wyświetli „coś poszło nie tak”, jeśli którekolwiek z poprzednich poleceń się zepsuło (bash czyta od lewej do prawej)
cd foo && rm a && cd bar && rm b || echo "something went wrong"
Prawdziwy przykład (stworzyłem dir foo, plik a, pasek dir i plik b tylko dla prawdziwej wersji demonstracyjnej):
gv@debian:/home/gv/Desktop/PythonTests$ cd foo && rm a && cd bar && rm bb || echo "something is wrong"
rm: cannot remove 'bb': No such file or directory
something is wrong #mind the error in the last command
gv@debian:/home/gv/Desktop/PythonTests$ cd foo && rm aa && cd bar && rm b || echo "something is wrong"
rm: cannot remove 'aa': No such file or directory
something is wrong #mind the error in second command in the row
I wreszcie, jeśli wszystkie polecenia zostały wykonane pomyślnie (kod wyjścia 0), skrypt po prostu kontynuuje:
gv@debian:/home/gv/Desktop/PythonTests$ cd foo && rm a && cd bar && rm b || echo "something is wrong"
gv@debian:/home/gv/Desktop/PythonTests/foo/bar$
# mind that the error message is not printed since all commands were successful.
Należy pamiętać, że przy użyciu && następna komenda jest wykonywana, jeśli poprzednia komenda została zakończona kodem 0, co dla bash oznacza sukces.
Jeśli jakieś polecenie nie działa w łańcuchu, polecenie / skrypt / cokolwiek następuje || zostanie stracony.
Dla przypomnienia: jeśli musisz wykonać różne działania w zależności od złamanego polecenia, możesz to również zrobić za pomocą klasycznego skryptu, monitorując wartość, $?
która zgłasza kod wyjścia dokładnie poprzedniego polecenia (zwraca zero, jeśli polecenie zostało wykonane pomyślnie lub inna liczba dodatnia, jeśli polecenie nie powiedzie się)
Przykład:
for comm in {"cd foo","rm a","cd bbar","rm b"};do #mind the error in third command
eval $comm
if [[ $? -ne 0 ]];then
echo "something is wrong in command $comm"
break
else
echo "command $comm executed succesful"
fi
done
Wynik:
command cd foo executed succesfull
command rm a executed succesfull
bash: cd: bbar: No such file or directory
something is wrong in command cd bbar
Wskazówka: Możesz ukryć komunikat „bash: cd: bbar: Brak takiego pliku ...” poprzez zastosowanie eval $comm 2>/dev/null