Ответы:
Запустите скрипт bash с помощью bash -x ./script.sh
или добавьте его в свой скрипт, set -x
чтобы увидеть результаты отладки.
Дополнительно с bash
4.1 или позже:
Если вы хотите записать выходные данные отладки в отдельный файл, добавьте это в ваш скрипт:
exec 5> debug_output.txt
BASH_XTRACEFD="5"
Смотрите: https://stackoverflow.com/a/25593226/3776858
Если вы хотите увидеть номера строк, добавьте это:
PS4='$LINENO: '
logger
команде, вы можете использовать ее для записи отладочной информации через системный журнал с отметкой времени, именем скрипта и номером строки:
#!/bin/bash
exec 5> >(logger -t $0)
BASH_XTRACEFD="5"
PS4='$LINENO: '
set -x
# Place your code here
Вы можете использовать опцию -p
в logger
команде для установки индивидуального объекта и уровня , чтобы написать вывод через локальный системный журнал для своей собственной логфайл.
BASH_XTRACEFD="5"
bash, записывает вывод трассировки, сгенерированный, когда set -x
он включен, в файловый дескриптор 5. exec 5> >(logger -t $0)
перенаправляет вывод из файлового дескриптора 5 в logger
команду.
set -x
Я всегда использую set -x
и set +x
. Вы можете обернуть области, которые вы хотите видеть, что происходит с ними, чтобы повернуть детализацию вверх / вниз.
#!/bin/bash
set -x
..code to debug...
set +x
Также, если вы выполнили работу по разработке и знакомы со стилем логгеров, которые называются log4j, log4perl и т. Д., Вы можете использовать log4bash .
выдержкаПосмотрим правде в глаза - просто старое эхо просто не режет это. log4bash - это попытка улучшить ведение журнала для сценариев Bash (т. е. сделать так, чтобы вход в Bash меньше занимал).
Оттуда вы можете делать такие вещи в своих скриптах Bash:
#!/usr/bin/env bash
source log4bash.sh
log "This is regular log message... log and log_info do the same thing";
log_warning "Luke ... you turned off your targeting computer";
log_info "I have you now!";
log_success "You're all clear kid, now let's blow this thing and go home.";
log_error "One thing's for sure, we're all gonna be a lot thinner.";
# If you have figlet installed -- you'll see some big letters on the screen!
log_captains "What was in the captain's toilet?";
# If you have the "say" command (e.g. on a Mac)
log_speak "Resistance is futile";
В результате этого типа вывода:
Если вам нужно что-то более портативное, есть и старшее log4sh
. Работы аналогичные log4bash
, доступные здесь:
alias say="spd-say"
.bashrc, который имитирует say
команду из других дистрибутивов или OS X.
Есть отладчик bash, bashdb , который устанавливается во многих дистрибутивах. Он использует встроенный расширенный режим отладки bash ( shopt -s extdebug
). Это очень похоже на GDB; вот пример сеанса, чтобы придать некоторый вкус:
$ ls
1st.JPG 2ndJPG.JPG
$ cat ../foo.sh
for f in *.JPG
do
newf=${f/JPG/jpg}
mv $f $newf
done
$ bashdb ../foo.sh
(foo.sh:1):
1: for f in *.JPG
bashdb<0> next
(foo.sh:3):
3: newf=${f/JPG/jpg}
bashdb<1> next
(foo.sh:4):
4: mv $f $newf
Как и в GDB, оператор показывается непосредственно перед его выполнением. Таким образом, мы можем исследовать переменные, чтобы увидеть, что будет делать оператор, прежде чем он это сделает.
bashdb<2> print $f $newf
1st.JPG 1st.jpg
bashdb<3> next
(foo.sh:1):
1: for f in *.JPG
bashdb<4> next
(foo.sh:3):
3: newf=${f/JPG/jpg}
bashdb<5> next
(foo.sh:4):
4: mv $f $newf
bashdb<6> print $f $newf
2ndJPG.JPG 2ndjpg.JPG
Это не то, что мы хотим! Давайте снова посмотрим на расширение параметров.
bashdb<7> print $f ${f/JPG/jpg}
2ndJPG.JPG 2ndjpg.JPG
bashdb<8> print $f ${f/JPG$/jpg}
2ndJPG.JPG 2ndJPG.JPG
bashdb<9> print $f ${f/%JPG/jpg}
2ndJPG.JPG 2ndJPG.jpg
ОК, это работает. Давайте установим newf
правильное значение.
bashdb<10> eval newf=${f/%JPG/jpg}
$? is 0
bashdb<11> print $f $newf
2ndJPG.JPG 2ndJPG.jpg
Выглядит неплохо. Продолжите сценарий.
bashdb<12> next
Debugged program terminated normally. Use q to quit or R to restart.
$ ls
1st.jpg 2ndJPG.jpg
Стандартный метод отладки сценариев в большинстве оболочек на основе Bourne, таких как bash, - писать set -x
в верхней части сценария. Это сделает bash более подробным о том, что делается / выполняется, и как оцениваются аргументы.
-x Print commands and their arguments as they are executed.
это полезно как для интерпретатора, так и для скриптов. Например:
$ find "$fileloc" -type f -prune "$filename" -print
+ find /var/adm/logs/morelogs -type f -prune '-name *.user' -print
find: unknown predicate '-name *.user'
$ find "$fileloc" -type f -prune $filename -print
+ find /var/adm/logs/morelogs -type f -prune -name '*.user' -print
find: '/var/adm/logs/morelogs': No such file or directory
Выше мы видим, почему поиск не работает из-за некоторых одинарных кавычек.
Чтобы отключить функцию, просто введите set +x
.
Вы можете использовать комбинированную среду Eclipse и Shelled с помощью скрипта "_DEBUG.sh", приведенного ниже.
По умолчанию инструмент разработки Shelled используется /bin/dash
в качестве интерпретатора. Я изменил это, чтобы /bin/bash
иметь лучшую совместимость с большинством примеров оболочек в Интернете и моей средой.
ПРИМЕЧАНИЕ. Вы можете изменить это, выбрав: Окно -> Параметры -> Сценарий оболочки -> Интерпретаторы.
В пакете Debugger есть шаги по использованию _DEBUG.sh
сценария для отладки сценария, который в основном (readme.txt):
- Создать проект сценария оболочки: Файл -> Создать -> Другое -> Сценарий оболочки -> Мастер проекта сценария оболочки .
- Создайте файл сценария Bash: Файл -> Создать -> Файл . Для этого примера это будет
script.sh
. Расширение должно быть ".sh" и является обязательным.- Скопируйте файл
_DEBUG.sh
в папку проекта.Вставьте следующий текст в начало файла
script.sh
:. _DEBUG.sh
Если файл создан в Microsoft Windows, то обязательно выполните File -> Convert Line Delimiters To -> Unix .
Настройте конфигурацию запуска отладки: Run -> Debug Configurations -> Bash script ... Здесь можно установить 2 поля:
a) «Сценарий Bash:» - путь в рабочей области Eclipse к сценарию Bash для отладки.
e) «Порт отладчика: 33333»Переключитесь на перспективу Debug. Запустите сеанс отладки. Запустите
script.sh
из оболочки Bash.
Этот bash-отладчик обладает всеми функциями стандартных программных отладчиков, таких как:
Shelled (Shell редактор сценариев) IDE (Integrated Development Environment) имеет дополнительный бонус выполнения проверки контекста, выделяя и отступов при написании сценария. Если он не имеет правильного отступа, вы можете сразу же пометить / указать много ошибок там.
Тогда есть другие преимущества IDE, такие как:
В последние годы появился замечательный ресурс: http://shellcheck.net
он показывает вам больше, чем обычный bash, позволяя легко находить эти противные незакрытые кавычки или фигурные скобки и т. д.
Просто убедитесь, что вы не вставляете конфиденциальную информацию (ips, пароли и т. Д.) Через сеть ... (особенно если это http, незашифрованный) (я считаю, что shellcheck также доступен для загрузки, но я не уверен)
В настоящее время есть VS Code Bash Debug.
https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug
Он имеет «Step in / out / over», а также показывает значение каждой переменной.