set -v
Тема дорожной карты · Bash
set -v (эквивалентно set -o verbose) — параметр отладки Bash, который выводит каждую строку shell-скрипта в стандартный поток ошибок точно в том виде, в каком она считывается, до выполнения какой-либо подстановки переменных или расширений. Это отличается от set -x (xtrace), который выводит команды после расширения и показывает разрешённые значения переменных — set -v полезен, когда нужно видеть необработанный, нераскрытый источник того, что Bash обрабатывает, что делает его ценным дополнением в рабочих процессах отладки Bash. Можно активировать подробный режим только для конкретного раздела shell-скрипта, обернув его командами set -v и set +v, ограничивая вывод нужной областью. Поскольку set -v выводит каждую строку, включая комментарии и пустые строки, он используется в производственной автоматизации Linux реже, чем set -x, но незаменим для диагностики проблем разбора shell-скриптов или понимания того, как обрабатываются встроенные документы и многострочные конструкции. Знакомство с set -v и его взаимодействием с другими параметрами set является частью комплексных практик отладки Bash-скриптов и Linux.
Как это работает
set -v: 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 -v: трейс через set -x даёт слишком много вывода (фокусируйте); игнор shellcheck-предупреждений ("стиль" — на самом деле тонкие баги); не тестируете на целевой среде (ваш zsh-аливасный Mac не production Ubuntu).