Один из самых частов вопросов как среди администраторов, так и среди пользователей UNIX - как отлаживать скрипты на bash?
Отладка такого скрипта может быть не простым занятием. Есть различные способы выполнения этой задачи.
Метод #1 - использование опции -x
Просто запустите скрипт с опцией -x. Например:
$ bash -x script-name
$ bash -x domains.sh
Метод #2 - использование встроенного набора команд
Вы можете включать и выключать режим отладки используя следующие команды внутри скрипта:
set -x - Показывать командны и параметры, которые выполняются.
set -v - Показывать строки по мере их чтения.
Вы можете использовать их следующим образом:
#!/bin/bash clear # включаем режим отладки set -x for f in * do file $f done # выключаем режим отладки set +x ls # прочие команды
Так же для отладки вы можете заменить первую строчку скрипта на #!/bin/bash -xv.
Метод #3 - Написать отладочную функцию DEBUG
Добавьте переменную _DEBUG и присвойте ей значение on:
_DEBUG="on"
Затем добавьте следующую функцию в ваш скрипт:
function DEBUG()
{
[ "$_DEBUG" == "on" ] && $@ || :
}
Далее во всех местах где нужна отладка используйте примерно вот такой код:
DEBUG echo "File is $filename"
Или даже вот такой:
DEBUG set -x
... отлаживаемая часть скрипта
DEBUG set +x
Когда отладка скрипта будет закончена можно просто присвоить переменной _DEBUG значение off.
Рассмотрим вот такой скрипт:
#!/bin/bash
_DEBUG="on"
function DEBUG()
{
[ "$_DEBUG" == "on" ] && $@ || :
}
DEBUG echo 'Reading files'
for i in *
do
grep 'something' $i > /dev/null
[ $? -eq 0 ] && echo "Found in $i file" || :
done
DEBUG set -x
a=2
b=3
c=$(( $a + $b ))
DEBUG set +x
echo "$a + $b = $c"
Сохраним скрипт, выполним и посмотрим на результат выполнения:
Reading files
Found in xyz.txt file
+ a=2
+ b=3
+ c=5
+ DEBUG set +x
+ '[' on == on ']'
+ set +x
2 + 3 = 5
Теперь установим значение переменной _DEBUG в off и попробуем ещё раз выполнить скрипт. В результате мы увидим следующее:
Found in xyz.txt file
2 + 3 = 5
То что вы видели - пример простой и эффективной отладки скрипта.
Anonymous 2011-10-25 00:08:20 (#)