Как отладить сценарий удара?

Если Вы, ОС пропускает GNU, находите-iname опцию, вот портативный способ достигнуть того же:

cifind()
{
  pattern=""
  l=${#1}
  i=1
  while [ $i -le $l ] ; do
    lc=$(echo "$1" | cut -c $i-$i | tr '[A-Z]' '[a-z]')
    uc=$(echo "$lc" | tr '[a-z]' '[A-Z]')
    if [ ."$lc" != ."$uc" ] ; then
      pattern="${pattern}[$lc$uc]"
    else
      pattern="${pattern}$lc"
    fi
    i=$((i + 1))
  done
  find . -name "*$pattern*"
}
144
14.09.2014, 17:41
8 ответов

Используя Eclipse

Вы можете использовать комбинированное окружение Eclipse и Shelled со скриптом "_DEBUG.sh", ссылка на который приведена ниже.

Switching shells

По умолчанию инструмент разработки Shelled в качестве интерпретатора использует /bin/dash. Я изменил его на /bin/bash, чтобы иметь лучшую совместимость с большинством примеров оболочек в интернете и моем окружении.

ЗАМЕЧАНИЕ: Вы можете изменить это, перейдя по ссылке: Window -> Preferences -> Shell Script -> Interpreters

Setup Instructions

В пакете отладчика есть шаги по использованию _DEBUG.sh скрипта для отладки вашего скрипта, который по сути (readme.txt):

  1. Create Shell Script Project: File -> New -> Other -> Shell Script -> Shell Script Project Wizard.
  2. Создайте файл Bash скрипта: File -> New -> File. Для данного примера это будет script.sh. Расширение должно быть ".sh" и равно Обязательно.
  3. Скопируйте файл _DEBUG.sh в папку проекта.
  4. Вставьте следующий текст в верхнюю часть файла script.sh:

    . _DEBUG.sh
    
  5. Если файл создан в Microsoft Windows, то обязательно выполните File -> Convert Line Delimiters To -> Unix.

  6. Установите конфигурацию запуска отладки: Run -> Debug Configurations -> Bash script... Есть 2 поля для установки Вот:

    a) "Бэш-скрипт:" - путь в рабочей области Затмение к Бэш-скрипту для отладки.
    e) "Порт отладчика:" 33333

  7. Переключиться на отладочную перспективу. Запустите сеанс отладки. Запустите script.sh из bash shell.

UI отладчика bash

enter image description here

Этот отладчик bash имеет все возможности стандартных отладчиков программирования, таких как:

  • переключение между режимами
  • Пошаговая операция
  • Пошаговые, пошаговые, пошаговые функции и подпрограммные
  • Исследование кода или переменных в любой момент во время работы скрипта

IDE (Integrated Development Environment) Shelled (Shell Script Editor) имеет дополнительный бонус к выполнению контекстной проверки, подсветки и отступов во время написания скрипта. Если он не отступит, то вы сможете сразу же отметить/локализовать там множество ошибок.

Затем есть другие преимущества IDE, такие как:

  • TODO список задач
  • Mylyn Task
  • Bookmark list
  • Multiple Window Editing
  • Remote Sharing of the environment
13
27.01.2020, 19:28

Стандартный метод отладки сценариев в большинстве оболочек на основе Борна, таких как 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

В приведенном выше примере мы можем увидеть, почему find не работает из-за некоторых одинарных кавычек.

Чтобы отключить эту функцию, просто введите set + x .

19
27.01.2020, 19:28

Запустите сценарий 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 , чтобы установить отдельное средство и уровень для записи вывода через локальный системный журнал в его собственный файл журнала.

144
27.01.2020, 19:28

Используя set -x

, я всегда использую set -x и set + x . Вы можете обернуть области, которые хотите увидеть, что с ними происходит, чтобы увеличить / уменьшить подробность.

#!/bin/bash

set -x
..code to debug...
set +x

log4bash

Также, если вы занимались разработкой и знакомы со стилем средств ведения журнала, которые имеют имена log4j, log4perl и т. Д., Тогда вы можете использовать log4bash .

отрывок

Посмотрим правде в глаза - старое доброе эхо не справляется. log4bash - это попытаться улучшить ведение журнала для сценариев 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";

Результатом будет следующий тип вывода:

ss1

log4sh

Если вам нужно что-то более портативное, есть также более старый log4sh . Работает аналогично log4bash , доступном здесь:

59
27.01.2020, 19:28

Есть отладчик 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

OK, это работает. Установим 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
35
27.01.2020, 19:28

Просто используйте:

#!/bin/bash -x

то же самое для оболочки:

#!/bin/sh -x
6
27.01.2020, 19:28

В последние годы появился замечательный ресурс: http://shellcheck.net

это показывает больше, чем обычный Bash, что позволяет легко найти эти надоенные цитаты или вьющиеся скобки и т. Д.

Просто убедитесь, что вы не вставляете чувствительные Infos (IPS, пароли и т. Д.) Через сеть ... (тем более, как это есть http, незашифрованные) (я считаю, что Shellcheck также доступно для скачивания , но я не уверен)

8
27.01.2020, 19:28

В настоящее время существует отладка VS Code Bash.

https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug

Он имеет «Шаг входа / выхода / выхода», а также показывает значение каждой переменной.

VS Code Bash Debug screenshot

7
27.01.2020, 19:28

Теги

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