Отладка

Тема дорожной карты · Bash

Эффективная отладка Bash-скриптов опирается на комбинацию встроенных параметров оболочки: set -x включает трассировку выполнения, печатая каждую команду перед её запуском; set -e завершает работу при первой ошибке; set -u обнаруживает ссылки на неустановленные переменные — вместе эти три флага выявляют большинство ошибок в shell-скриптах Linux. Команда bash -n script.sh выполняет синтаксическую проверку без запуска кода, что делает её быстрым первым шагом при сбое shell-скрипта в командной строке. Для целенаправленной отладки оберните подозрительный раздел конструкцией set -x в начале и set +x в конце, чтобы трассировать только нужный блок кода Bash, уменьшая шум от больших скриптов автоматизации. Специальные переменные BASH_XTRACEFD, LINENO, FUNCNAME и BASH_SOURCE предоставляют богатый контекст в трассировочном выводе, а установка PS4='+(${BASH_SOURCE[0]}:${LINENO}): ' делает каждую трассируемую строку самодокументируемой. Инструменты вроде shellcheck выполняют статический анализ и обнаруживают десятки распространённых ошибок написания Bash-скриптов — ошибки экранирования, непреднамеренное раскрытие глобов и проблемы переносимости — до того как скрипт будет запущен на Linux.

Как это работает

Отладка: set -x трейсит каждую команду до исполнения (пара set +x для отключения); bash -x script.sh — глобально с трейсом. PS4="+ \${BASH_SOURCE}:\${LINENO}: " делает trace-вывод с файлом + строкой. set -v печатает команды при чтении (полезнее -x). Для глубокой отладки: bashdb (gdb-style debugger) или стратегические echo. Shellcheck (статический анализатор) ловит большинство багов до рантайма.

Когда применять

Shellcheck — на каждый скрипт; ловит 90% распространённых багов (незакавыченные vars, useless cat, sed-измы и т.д.). set -x — вокруг отлаживаемой секции, не глобально (объём вывода огромный). Добавьте --debug флаг в скрипты, выборочно включающий set -x.

Типичные ошибки

Ловушки Отладка: трейс через set -x даёт слишком много вывода (фокусируйте); игнор shellcheck-предупреждений ("стиль" — на самом деле тонкие баги); не тестируете на целевой среде (ваш zsh-аливасный Mac не production Ubuntu).

Связанные понятия

Полезные ресурсы