Відповіді:
Почніть свій 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
команди, ви можете використовувати це для написання виводу налагодження через ваш syslog із позначкою часу, ім'ям сценарію та номером рядка:
#!/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
Стандартний метод налагодження сценаріїв у більшості оболонок на основі Борна, як-от bash, - це писати set -x
у верхній частині вашого сценарію. Це зробить грубість більш детальною щодо того, що робиться / виконується, і як оцінюються аргументи.
-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 та Shells за допомогою сценарію "_DEBUG.sh", який пов'язаний нижче.
За замовчуванням інструмент розробки Sheiled використовує /bin/dash
як інтерпретатор. Я змінив це, щоб /bin/bash
мати кращу сумісність з більшістю прикладів оболонок в Інтернеті та моєму середовищі.
ПРИМІТКА. Ви можете змінити це, перейшовши до: Вікно -> Налаштування -> Сценарій оболонки -> Інтерпретатори
У пакеті налагодження є кроки для використання _DEBUG.sh
сценарію для налагодження сценарію, який є в основному (readme.txt):
- Створіть проект сценарію оболонки: Файл -> Нове -> Інше -> Сценарій оболонки -> Майстер проекту сценарію оболонки .
- Створіть файл сценарію Bash: Файл -> Створити -> Файл . Для цього прикладу воно буде
script.sh
. Розширення має бути ".sh" і є обов'язковим.- Скопіюйте файл
_DEBUG.sh
у папку проекту.Вставте наступний текст у верхню частину файлу
script.sh
:. _DEBUG.sh
Якщо файл створено в Microsoft Windows, тоді обов'язково виконайте файл -> Перетворити розділові лінії в -> Unix .
Налаштування конфігурації запуску налагодження: Виконати -> Конфігурації налагодження -> Сценарій Bash ... Тут потрібно встановити 2 поля:
a) "Bash script:" - Шлях у робочій області Eclipse до сценарію Bash для налагодження.
д) "Порт налагодження:" 33333Переключіться на перспективу налагодження. Почніть сеанс налагодження. Запуск
script.sh
із шкаралупи bash.
Цей налагоджувач bash має всі функції стандартних відладчиків програмування, такі як:
Shelled (Shell редактор сценаріїв) IDE (Integrated Development Environment) має додатковий бонус виконання перевірки контексту, виділяючи і відступів при написанні сценарію. Якщо він не вводиться правильно, ви можете негайно позначити / локалізувати багато помилок.
Потім є інші переваги IDE, такі як:
В останні роки з’явився чудовий ресурс: http://shellcheck.net
це показує вам більше, ніж звичайний баш, що дозволяє легко знаходити ці примхливі незакриті цитати або фігурні дужки тощо.
Просто переконайтеся, що ви не вставляєте чутливі відомості (ips, паролі тощо) через мережу ... (особливо, якщо це http, незашифрований) (я вважаю, що також можна завантажити, але я не впевнений)
На сьогоднішній день існує налагодження VS Code Bash.
https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug
Він має "Крок / вихід / перехід", а також показує значення кожної змінної.