Взяте слово " кожна команда залежить від кожної попередньої команди. Якщо будь-яка команда не вдається, весь сценарій повинен вийти з ладу " буквально, я думаю, вам не потрібна спеціальна функція для лікування помилок.
Все, що вам потрібно - це зв’язати свої команди з &&
оператором і ||
оператором, який виконує саме те, що ви написали.
Наприклад, цей ланцюг розірветься і надрукує "щось пішло не так", якщо будь-яка з попередніх команд зламалася (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