Всем привет, кого не видел, и новеньким. Нас тут уже овер 10к единомышленников, растём!
- Вопрос из зала — я бывший Java-разработчик, подался в девопсы, теперь неспешно изучаю Bash. Подскажите, есть ли какая-то альтернатива конструкции try/catch?
Начнём с того, что бывших разработчиков не бывает. Даже если ты выйдешь из айти и начнёшь ловить крабов, айти не выйдет из тебя. Проверено многолетним опытом, и не только моим.
Ну а по делу, try/catch в Bash — нет. На этом можно было бы и закончить, но, увы… давай обсудим.
Аналогичного поведения можно добиться, используя логический оператор ||.
Например:
command1 || command2
Если первая команда вывалит ошибку, то отработает вторая команда. Ну чем не try/catch? Даже лучше! Правда, концепция работы не такая, как в других языках.
На практике это выглядит так:
false || echo "error, returned false"
Сейчас сработает catch и выведет «error, returned false», так как команда false всегда возвращает ошибку. Статус: exit 1.
А если false заменить на true, то сработает try и в терминале ничего не отобразится. Бесподобно.
Итоговая конструкция будет такой:
#!/bin/bash
{ # try
echo "hello bashdays"
false
} || { # catch
echo "error, returned false"
}
Для catch можно сделать отдельную функцию, которая будет автоматически включать режим дебага (set -x) либо какие-то другие свистоперделки для отладки.
Вообще это больше относится к костылям, и подобное можно реализовать с таким же успехом на IF’ах. А можно банально проверять статус выхода: если > 0, то кирдык.
Я такие конструкции не использую, максимум втыкаю в начале скрипта set -e. Если статус команды будет > 0, то немедленно всё выпадет в осадок.
Если есть чего добавить, велком в комментарии. Возможно, у тебя есть секретный модуль для Bash с try/catch.








Комментарии