Введение / Зачем это нужно
Работа с Bash-скриптами часто бывает быстрой, но когда что-то идёт не так, отладка может затянуться. В этой статье мы покажем, как использовать встроенные инструменты отладки Bash, чтобы быстро находить и устранять ошибки, не прибегая к сторонним IDE. После выполнения этих шагов вы сможете самостоятельно диагностировать проблемы, даже если скрипт сложный.
Требования / Подготовка
- Операционная система: Linux (Ubuntu, Debian, Fedora и т.д.)
- Версия Bash: 5.0 или выше (
bash --version) - Инструменты: текстовый редактор (например,
vim,nano), терминал с правами доступа пользователя (sudo не требуется для простых скриптов) - Необязательно: отладчик
bashdb(sudo apt install bashdbна Debian/Ubuntu)
Все команды предоставлены для Bash по умолчанию. Если у вас старая версия, обновите систему с помощью sudo apt update && sudo apt upgrade.
Шаг 1: Запустить скрипт с трассировкой
Самый быстрый способ увидеть, что происходит, — это запустить скрипт с ключом -x.
bash -x script.sh
Команда bash -x выводит каждую команду перед её выполнением, её параметры и текущее значение переменных. Это полезно для выявления ненужных веток или бесконечных циклов.
Шаг 2: Добавить точку останова с помощью trap
Для более точной отладки можно использовать trap с действием DEBUG. Это вызовет пользовательское сообщение перед каждой командой.
#!/usr/bin/env bash
trap 'echo ">>> Строка $LINENO" DEBUG' DEBUG
# Остальной скрипт...
Теперь перед каждой командой будет выводиться сообщение с номером строки, что позволяет быстро найти проблемный участок.
Шаг 3: Включить автоматическое завершение при ошибке
Если скрипт должен завершаться при первой ошибке, добавьте set -e в начало.
#!/usr/bin/env bash
set -e # завершать скрипт при любой ошибке
# Основная логика скрипта...
Внимание: set -e не работает для команд в условных выражениях (if, while). Используйте set -o pipefail, чтобы также завершать скрипт при ошибке в конвейере.
Шаг 4: Проверить переменные и пути
Для отладки значений переменных добавьте set -x в нужных местах или напрямую выведите их.
# внутри скрипта
echo "DEBUG: значение переменной input_file = $input_file"
[ -f "$input_file" ] || { echo "Ошибка: файл $input_file не найден"; exit 1; }
Теперь вы увидите значения даже при включённом set -x, что полезно для скриптов, работающих с путями и файлами.
Шаг 5: Использовать отладочные инструменты вроде bashdb или gdb
Для более продвинутой отладки установите bashdb (доступен в большинстве дистрибутивов).
sudo apt install bashdb # Debian/Ubuntu
sudo dnf install bashdb # Fedora
Затем запустите интерактивную сессию:
bashdb script.sh
Внутри bashdb вы можете использовать команды break, continue, step и print, чтобы управлять выполнением и исследовать состояние скрипта.
Шаг 6: Проверить права доступа к скрипту
Частая причина сбоев — отсутствие прав на выполнение.
chmod +x script.sh
Также убедитесь, что скрипт доступен для чтения (-r). Если у скрипта указан неправильный shebang (#!/usr/bin/env bash), убедитесь, что bash присутствует в $PATH.
Проверка результата
После внесения изменений перезапустите скрипт с той же отладочной информацией:
bash -x script.sh
Если больше нет лишних строк вывода и скрипт завершается с кодом 0, отладка успешна. Для автоматизации вы можете записать лог в файл:
bash -x script.sh > debug.log 2>&1
Проверьте debug.log на наличие ошибок или unexpected значений.
Возможные проблемы
- Скрипт завершается со статусом 127 – команда не найдена. Проверьте правильность написания и наличие её в
$PATH(echo $PATH). set -eне срабатывает внутриif– оберните условие в|| trueили используйтеset -o pipefail.- Скрипт зависает – возможно, бесконечный цикл. Используйте
timeoutдля принудительного завершения:timeout 30 ./script.sh. - Нет вывода
trap DEBUG– убедитесь, чтоtrapопределён перед выполнением кода скрипта (в начале файла).
Эти распространённые проблемы и их решения помогут быстро вернуть скрипт в рабочее состояние.