Bash: Грабли set -e и другие способы отладки

Совсем недавно, наткнулся на длинный bash скрипт не своего авторства и долго не мог понять, почему команды/программы возвращающие exit код отличный от нуля в начале скрипта не вызывают завершения скрипта, а в конце прерывают дальнейшие выполнения команд.

Разгадка скрывалась в вызове функции set -e, которая вызывает немедленный выход, если выходное состояние команды не нулевое ( кстати получить код выхода можно через переменную $? ). Помимо выставления флагов командой set их также можно отключить выполнив set +e.

Получить аналогичное поведение без использования функции set, можно вызвав bash с параметром -e:

/bin/bash -e yourscript.sh

Использование set -e так же не рекомендуется при написание init.d скриптов, т.к., зачастую, скрипты проверки состояния служб (демонов) могут возвращать не нулевое значение (источник: Debian Policy Manual 9.3.2 и What does 'set -e' do, and why might it be considered dangerous? ).

Помимо вышеупомянутого параметра -e у bash есть еще несколько параметров, которые просто не оценимы при написание/отладке bash скриптов:

  • -u выводит сообщение об ошибке и завершает скрипт, при попытке использования не инициализированной переменной
  • -v выводит в стандартный поток ошибок ( stderr ) выполняемые команды/программы

Таким образом, при отладке лучше всего вызывать bash с параметрами -euv:

bash -euv your_script.sh

Вот немного ссылок на эту тему: