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

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

Я говорю об использовании точек останова и подобных вещей.

31
задан 20 June 2016 в 13:17

7 ответов

Да, есть Проект Bash Debugger .

alt text

Вы также можете использовать set -x и set-v при исполнении. ЗДЕСЬ и ЗДЕСЬ или ЗДЕСЬ - некоторая информация об этом.

удачи!

0
ответ дан 20 June 2016 в 13:17

shellcheck является лучшим в городе -

http://www.shellcheck.net/

вы также можете интегрировать с vim, вот git repo -

https://github.com/koalaman/shellcheck

0
ответ дан 20 June 2016 в 13:17

В настоящее время существует расширение отладки кода Visual Studio Bash . Он имеет «Step in / out / over» и может показывать значение каждой переменной.

VS Code Bash Debug screenshot

0
ответ дан 20 June 2016 в 13:17

Вы можете использовать эту маленькую функцию для перехода в «консоль»:

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», которая выведет все доступные переменные и их ценности. Вы также можете добавить свои собственные команды.

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

0
ответ дан 20 June 2016 в 13:17

Опцией GUI для отладки сценария удара является Eclipse IDE с BashEclipse/Shelled pluggins.

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

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

  • Переключатель Точки останова
  • Единственная Пошаговая операция
  • Неродной в, Выйдите, Переступите через функции и подпрограммы
  • Исследование переменных кода в любой точке, в то время как сценарий работает
  • Список задач TODO
  • Список закладок
  • Несколько редактирование окна
  • Удаленное Совместное использование среды проекта

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

Проекция отладки: Eclipse Script Debug Perspective

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

1
ответ дан 20 June 2016 в 13:17

Там несколько различных путей, т.е.:

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

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

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

20
ответ дан 20 June 2016 в 13:17

В соответствии с тем, что говорит 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 сделает это, но есть лучший.

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

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

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

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

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

0
ответ дан 20 June 2016 в 13:17

Другие вопросы по тегам:

Похожие вопросы: