Как отладить скрипт bash?

31

Есть ли способ отладки bash-скрипта без использования echo и logging?

Я говорю об использовании точек останова и тому подобного.

UAdapter
источник

Ответы:

20

Есть несколько разных способов, а именно:

  • Запустите ваш скрипт с опцией -x

    bash -x yourscript.sh
  • Добавление set -xновой строки в начале вашего файла сценария после Shebang #!/bin/bashи перед началом вашего сценария, set -vбудет отображать строки ввода оболочки, set -xотображает выполненные команды и аргументы

  • замените shebang вашего файла сценария на #!/bin/bash -xv

NES
источник
4

Вы можете использовать эту маленькую функцию, чтобы попасть в «консоль»:

function debug
{
    echo "#############|  Entering DEBUG mode  |####################";
    cmd=""
    while [[ $cmd != "exit" ]]; do
        read -p "> " cmd
        case "$cmd" in
            vars ) ( set -o posix ; set );;
            exit ) ;;
            * ) eval "$cmd";;
        esac
    done
    echo "#############|  End of DEBUG mode |####################";
}

Затем внутри вашего сценария (ПРИМЕР):

for file in *; do
...
   if [[ $file == "strange_case.txt" ]]; then
       # break the code here to analyze:
       debug
   fi
...
done

Он будет принимать любую команду, сохраняя локальные переменные нетронутыми. Чтобы выйти из режима «отладки», введите «exit» (он не выйдет из сценария), и он продолжит работу с кодом. Если вы используете «debug» внутри цикла, он будет останавливаться каждый раз. Вы можете заключить его в «if» (как в примере выше) или создать функцию «watch»:

function debug_watch
{
    if [[ $1 == $2 ]]; then
        debug
    fi
}

# And Use it:

debug_watch "$file" "strange_case.txt"

Я также добавил команду "vars", которая выведет все доступные переменные и их значения. Вы также можете добавить свои собственные команды.

Я сделал код за несколько минут, поэтому используйте его на свой страх и риск. Помните, что в режиме отладки может быть выполнена любая команда, поэтому это создает угрозу безопасности, если вы оставите ее в производственном скрипте.

Лепе
источник
3
Избегайте использования имен переменных в верхнем регистре. Ваш риск переопределяет специальные переменные оболочки и переменные среды. Кроме того, убедитесь, что вы цитируете расширения параметров, когда они используются в качестве аргументов, чтобы избежать расщепления слов и расширения пути, встречающегося в результате. например * ) eval "$cmd" ;;и debug_watch "$file" strange_case.txt.
гейра
Отредактированный код, предложенный гейрой.
Лепе
2

В духе того, что говорит NES, в bash установлены флаги, позволяющие отладку.

set -xФлаг может быть установлен и снят с охраной либо из терминала, или из вашего сценария. Используя +или -:

#!/bin/bash
#fileinfo
ls -l $1
set -x      # start debugging here
wc -l $1
set +x      # stop debugging here
file $1
set -v      # start verbose output
w | more    
echo ""
echo -n "Number of users: "
set +v      # end verbose output
who | wc -l

Вот что setделают команды:

  • set -f Отключить генерацию имени файла с помощью метасимволов.
  • set -v Печатает (подробный) строки ввода оболочки, как они читаются.
  • set -x Напечатайте трассировки команд перед выполнением команды.

setна самом деле имеет много функций, но, к сожалению, нет справочной страницы, так как это встроенный инструмент оболочки. Руководство по настройке находится в документации GNU Bash .

Существует множество инструментов командной строки, которые могут помочь вам получить подробную информацию о вашей программе, например:

  • stat отображать состояние файла или файловой системы
  • file определить тип файла.
  • hexdump фильтр, который отображает указанные файлы в различных форматах
  • nohup Запустите скрипт, который не зависнет

    и многие другие. Я пытался думать о команде, которая показывает скрытые символы, но я не могу сделать это прямо сейчас. Hexdump сделает это, но есть лучший.

Команда key ctrl\приведет к тому, что запущенная программа или скрипт выполнит дамп памяти. Тогда вы можете проанализировать coredump. Я бы, вероятно, использовал gdb для анализа coredump, но для этого существует много программ.

В оболочке bash также есть несколько опций для отладки. варианты --debugger, -vподробные --dump-stringsи другие отличные варианты, чтобы помочь вам. Проверьте их, используя man bash.

Команда trap(встроенная оболочка) может быть очень полезной для вас. trap говорит, что если ваша программа неожиданно завершает работу, выполните что-то. Вы читаете о ловушке и других полезных встроенных функциях Bash Shell здесь .

Говоря в общем на данный момент, отладка - огромная тема на любом языке. Некоторые другие темы, которые могут быть полезны для отладки на любом языке программирования, включают перенаправление оболочки и обработку сигналов.

Наконец, я понимаю, что пример, который я использовал, тривиален, но некоторые сценарии оболочки могут содержать сотни строк. В этих ситуациях мне нравится либо вставлять теги комментариев и блокировать код, который я подозреваю, что он неисправен, либо альтернативно вставлять команду выхода и пытаться изолировать функциональный код от сломанного кода, используя технику «разделяй и властвуй».

j0h
источник
1

Опция GUI для отладки сценария bash - это Eclipse IDE с плагинами BashEclipse / Shelled.

Это дает функции вашего вопроса ( breakpoints and stuff) вместе с множеством других функций для отладки сложных сценариев bash.

Некоторые из функций включают в себя:
( https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script )

  • Точка останова
  • Одна пошаговая операция
  • Функции Step-in, Step-out, Step-over и подпрограммы
  • Проверка переменных кода в любой точке во время работы скрипта
  • Список задач TODO
  • Список закладок
  • Редактирование нескольких окон
  • Удаленный доступ к среде проекта

Перспектива редактора сценариев: Eclipse Script IDE

Перспектива отладки: Перспектива отладки скрипта Eclipse

Шаги для использования, чтобы добавить Shelledи BashEclipseплагины для затмения. Затем запустите процедуру, представленную в текстовом файле read me для BashEclipse, чтобы запустить отладчик.

Л.Д. Джеймс
источник