Если Вы, ОС пропускает 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*"
}
Вы можете использовать комбинированное окружение Eclipse и Shelled со скриптом "_DEBUG.sh", ссылка на который приведена ниже.
По умолчанию инструмент разработки Shelled в качестве интерпретатора использует /bin/dash
. Я изменил его на /bin/bash
, чтобы иметь лучшую совместимость с большинством примеров оболочек в интернете и моем окружении.
ЗАМЕЧАНИЕ: Вы можете изменить это, перейдя по ссылке: Window -> Preferences -> Shell Script -> Interpreters
В пакете отладчика есть шаги по использованию _DEBUG.sh
скрипта для отладки вашего скрипта, который по сути (readme.txt):
- Create Shell Script Project: File -> New -> Other -> Shell Script -> Shell Script Project Wizard.
- Создайте файл Bash скрипта: File -> New -> File. Для данного примера это будет
script.sh
. Расширение должно быть ".sh" и равно Обязательно.- Скопируйте файл
_DEBUG.sh
в папку проекта.Вставьте следующий текст в верхнюю часть файла
script.sh
:. _DEBUG.sh
Если файл создан в Microsoft Windows, то обязательно выполните File -> Convert Line Delimiters To -> Unix.
Установите конфигурацию запуска отладки: Run -> Debug Configurations -> Bash script... Есть 2 поля для установки Вот:
a) "Бэш-скрипт:" - путь в рабочей области Затмение к Бэш-скрипту для отладки.
e) "Порт отладчика:" 33333Переключиться на отладочную перспективу. Запустите сеанс отладки. Запустите
script.sh
из bash shell.
Этот отладчик bash имеет все возможности стандартных отладчиков программирования, таких как:
IDE (Integrated Development Environment) Shelled (Shell Script Editor) имеет дополнительный бонус к выполнению контекстной проверки, подсветки и отступов во время написания скрипта. Если он не отступит, то вы сможете сразу же отметить/локализовать там множество ошибок.
Затем есть другие преимущества IDE, такие как:
Стандартный метод отладки сценариев в большинстве оболочек на основе Борна, таких как 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
.
Запустите сценарий 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
, чтобы установить отдельное средство и уровень для записи вывода через локальный системный журнал в его собственный файл журнала.
set -x
, я всегда использую set -x
и set + x
. Вы можете обернуть области, которые хотите увидеть, что с ними происходит, чтобы увеличить / уменьшить подробность.
#!/bin/bash
set -x
..code to debug...
set +x
Также, если вы занимались разработкой и знакомы со стилем средств ведения журнала, которые имеют имена 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";
Результатом будет следующий тип вывода:
Если вам нужно что-то более портативное, есть также более старый log4sh
. Работает аналогично log4bash
, доступном здесь:
Есть отладчик 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
Просто используйте:
#!/bin/bash -x
то же самое для оболочки:
#!/bin/sh -x
В последние годы появился замечательный ресурс: http://shellcheck.net
это показывает больше, чем обычный Bash, что позволяет легко найти эти надоенные цитаты или вьющиеся скобки и т. Д.
Просто убедитесь, что вы не вставляете чувствительные Infos (IPS, пароли и т. Д.) Через сеть ... (тем более, как это есть http, незашифрованные) (я считаю, что Shellcheck также доступно для скачивания , но я не уверен)
В настоящее время существует отладка VS Code Bash.
https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug
Он имеет «Шаг входа / выхода / выхода», а также показывает значение каждой переменной.