пятница, 21 апреля 2017 г.

Небольшие заметки про отладку Bash скриптов


Если вам когда-либо приходилось писать сложные скрипты на Bash, то вы наверняка думали о двух вещах:
  1. Никогда больше не писать сложные скрипты на Bash.
  2. Как отлаживать то, что уже написано?
Если с первым пунктом все понятно, то ответ на второй вопрос не так просто найти. Интегрированный среды для пошаговой отладки я не нашел (если не брать в расчет странный BASH Debugger). Но способ получить трейс есть, также как и выполнить скрипт по шагам.

Получить трейс выполнения проще простого. Надо всего лишь запустить bash с параметром -x. Либо в самом коде выполнить команду set +x. Первый вариант выглядит предпочтительней, потому что вы извне контролируете — нужен вам подробный вывод или нет. Конечному пользователю такой вывод обычно не только не нужен, но и откровенно мешает.

Посмотрим, как это работает на практике. Например, следующий простейший скрипт имеет ветвление:
#!/bin/bash

if [[ "$1" == "hello" ]]; then
 echo "hello world!!!"
fi
Запускаем его с трассировкой выполнения и сразу видим, что происходит внутри:
$ bash -x ./my_mega_script.sh hello

+ [[ hello == \h\e\l\l\o ]]
+ echo 'hello world!!!'
hello world!!!
Для запуска своего скрипта с сохранением трассировки удобно использовать вспомогательный скрипт примерно такого содержания:
#/bin/bash

/bin/bash -x ./my_mega_script.sh 2>my_mega_script.log
В таком режиме отладочный вывод не будет мешать смотреть результаты выполнения скрипта. А если выполняется много действий в течении длительного времени, то для просмотра трассировки удобно в отдельном окне запустить следующую команду:
$ tail -f ./my_mega_script.log
Утилита tail с параметром -f (follow) выводит текст на экран по мере обновления файла.

Ну и напоследок, режим пошагового выполнения:
#!/bin/bash
echo "Press CTRL+C to proceed."
trap "pkill -f 'sleep 1h'" INT
trap "set +x ; sleep 1h ; set -x" DEBUG

###
# ДАЛЬШЕ ИДЕТ ВАШ КОД
После каждого нажатия Ctrl+C выполняется один шаг скрипта и потом "отладчик" засыпает на 1 час либо до следующего нажатия Ctrl+C.

Книги по теме:

Комментировать в ВКонтакте