Всем привет, кого не видел, и новеньким. Нас тут уже овер 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, то немедленно всё выпадет в осадок.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Тут нет правильных и неправильных решений. Как говорится, если работает, то уже хорошо. Остальное — детали.

Если есть чего добавить, велком в комментарии. Возможно, у тебя есть секретный модуль для Bash с try/catch.