В bash есть встроенная трассировка, и она может быть эффективнее любого printf-дебага.
1️⃣ Включаем трассировку
set -x
Теперь каждая команда будет выводиться перед выполнением:
+ var=10
+ echo 10
Отключить:
set +x
Полезно включать только на проблемном участке.
2️⃣ Отладка всего скрипта. Можно запустить сразу так:
bash -x script.sh
Или добавить в начало:
#!/bin/bash
set -x
3️⃣ Сделать трассировку читаемой. По умолчанию вывод начинается с +. Это скучно. Можно добавить больше контекста:
export PS4='+ $(date "+%H:%M:%S") ${BASH_SOURCE}:${LINENO}: '
Теперь вывод будет выглядеть так:
+ 14:32:10 script.sh:12: var=10
Здесь видно: время, файл и номер строки Для сложных скриптов - это крайне полезно.
4️⃣ Отдельный лог отладки. Чтобы не засорять stdout:
exec 3>/tmp/debug.log
BASH_XTRACEFD=3
set -x
Теперь трассировка уйдет в
/tmp/debug.log, а основной вывод останется чистым. Это особенно важно для автоматизации и CI.5️⃣ Отладка переменных. Полезные режимы:
set -u # ошибка при использовании unset переменной
set -e # выход при ошибке
set -o pipefail # ловим ошибки в пайпах
Продвинутый вариант:
set -euxo pipefail
BashTex 📱 #bash #utils