Найти тему
BASH DAYS | Linux Factory

А есть ли try/catch в Bash?

Оглавление

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

Тут нет правильных и неправильных решений. Как говорится если работает, то уже хорошо. Остальное детали.

Рекомендую почитать