Если взять слово « каждая команда зависит от каждой предыдущей команды. Если какая-либо команда терпит неудачу, весь сценарий должен потерпеть неудачу », я думаю, вам не нужны никакие специальные функции для обработки ошибок.
Все, что вам нужно, это связать ваши команды с &&
оператором и ||
оператором, который делает именно то, что вы написали.
Например, эта цепочка прервется и выведет «что-то пошло не так», если какая-либо из предыдущих команд прервалась (bash читает слева направо)
cd foo && rm a && cd bar && rm b || echo "something went wrong"
Реальный пример (я создал dir foo, файл a, dir bar и файл b только для реальной демонстрации):
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
И, наконец, если все команды были выполнены успешно (код выхода 0), скрипт просто продолжается:
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.
Важно помнить, что при использовании && следующая команда выполняется, если предыдущая команда вышла с кодом 0, что для bash означает успех.
Если какая-либо команда в цепочке не работает, то команда / скрипт / все, что следует || будет выполнен.
И просто для записи: если вам нужно выполнить различные действия в зависимости от команды, которая сломалась, вы также можете сделать это с помощью классического сценария, отслеживая значение $?
которого сообщает код завершения точно предыдущей команды (возвращает ноль, если команда выполнена успешно) или другое положительное число, если команда не выполнена)
Пример:
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
Выход:
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
Совет: Вы можете подавить сообщение "bash: cd: bbar: Нет такого файла ...", применив eval $comm 2>/dev/null