Linux

Как отладить Bash-скрипт: пошаговое руководство по исправлению ошибок

В этом руководстве вы узнаете, как быстро выявлять и устранять ошибки в Bash-скриптах с помощью встроенных инструментов отладки. Мы покажем конкретные команды и объясним, что делать при распространённых проблемах.

Обновлено 9 июля 2026 г.
10-15 мин
Средняя
FixPedia Team
Применимо к:Bash 5.xUbuntu 20.04/22.04Debian 11Fedora 36+

Введение / Зачем это нужно

Работа с 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 определён перед выполнением кода скрипта (в начале файла).

Эти распространённые проблемы и их решения помогут быстро вернуть скрипт в рабочее состояние.

Часто задаваемые вопросы

Как включить пошаговый режим отладки в Bash?
Почему скрипт завершается со статусом 127?
Как избежать зависания скрипта при ошибке?
Как отладить скрипт с использованием переменных и массивов?

Полезное

Запустить скрипт с трассировкой
Добавить точку останова с помощью trap
Включить автоматическое завершение при ошибке
Проверить переменные и пути
Использовать отладочные инструменты вроде `bashdb` или `gdb`
Проверить права доступа к скрипту

Эта статья помогла вам решить проблему?