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