Skip to content

Отладка в bash

Можно выполнить полную проверку синтаксиса w/:

Bash
bash -n script.sh

Технически это означает "читать команды, но не выполнять" (help set). В этом режиме bash не сообщит об ошибках времени выполнения, неправильной логике, неверных параметрах внешних команд и т.п. Но все равно он укажет на непарные кавычки и скобки, неправильный синтакис built-in функций bash и т.д.

bash -x (xtrace) выводит команды и их агрументы по мере выполнения. Трассировку xtrace можно включить и в середине скрипта командой set +x.

Вывод содержимого окружения

Cодержимое окружения полезно логировать при запуске сценария из cron, в системе непрерывной интеграции и в других случаях, когда окружение может измениться или отличаться от ожидаемого.
Для этого часто используются внешние команды env и printenv, но built-in команда set может дать больше информации, включая сведения о функциях. С другой стороны, set выводит много лишних подробностей, поэтому выбор за тобой.

Опасность утечки информации об окружении

Содержимое окружения часто содержит конфиденциальную инфу (username, пароли, ключи API и т.д.).
Чтобы предотвратить вывот такой инфы, юзай однострочники sed или Perl:

Bash
set | perl -pe 's/^(SECRET=).*/\1/g;'

Начиная с bash 3.0 поддерживает флаг --debugger и возможность расширенной отладки shopts. Но обычно хватает команды set -x.
Запуск bash --debugger - / path/to/script может привести к следующему результату:

Text Only
/path/to/script: /usr/share/bashdb/bashdb-main.inc: No such file or directory
/path/to/script: warning: cannot start debugger; debugging mode disabled

Если увидишь это сообщение, иди на сайт проекта Bash Debugger Project1 , в рамках которого разрабатывается "отладчик исходного кода для bash, следующий синтаксису команды gdb". Проблема может быть обусловлена несовместимостью с версией bash.


Соус: Книга "Идиомы Bash" --> Глава 10. "Помимо идиом: работа с bash" --> "Отладка в bash"

bash #debug