Всем привет кого не видел и новеньким. Нас тут уже овер 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 можно сделать отдельную функцию. Которая будет автоматически включать режим дебага (sex -x) либо какие-то другие свистоперделки для отладки.



Вообще это больше относится к костылям и подобное можно реализовать с таким же успехом на IF’ах. А можно банально проверять статус выхода, если > 0 то кирдык.



Я такие конструкции не использую, максимум втыкаю в начала скрипта set -e. Если статус команды будет > 0, то немедленно всё выпадет в осадок.



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



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



tags: #linux #bash



💩 @bashdays