Если вам когда-либо приходилось писать сложные скрипты на Bash, то вы наверняка думали о двух вещах:
- Никогда больше не писать сложные скрипты на Bash.
- Как отлаживать то, что уже написано?
Получить трейс выполнения проще простого. Надо всего лишь запустить 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.
Книги по теме: