bash: опция отладки и функции - PullRequest
9 голосов
/ 14 сентября 2011

Если я выполню

bash -x myscript.sh

, я получу отладочный вывод.

Но если у меня есть функция в myscript.sh, код в функции не зависит от опции -x,Он выводит только имя функции.

Как получить выходные данные отладки для функций в скриптах bash?

Обновление:

ПослеОтвет ztank1013, я только что понял, что я использовал ksh, а не bash.Кажется, в bash по умолчанию включена опция functrace в моей системе (спасибо bash-o-logist)

Я удовлетворен, но для сообщества я поддерживаю вопрос открытым для ksh.

Для скрипта:

#!/bin/ksh

a=2
testering(){
        a=3
        if [ $a -eq 3 ]; then
                echo lili
        fi
}
if [ $a -eq 2 ]; then
        echo mimi
fi

testering
exit

Вывод ksh -x ./testdebug.sh равен:

+ a=2
+ [ 2 -eq 2 ]
+ echo mimi
mimi
+ testering
lili
+ exit

Итак, для ksh, в чем прикол?

(Если ответа не будет, «правильный» перейдет в bash-o-logist.)

Ответы [ 5 ]

9 голосов
/ 14 сентября 2011

С bash вы можете использовать опцию functrace в вашем скрипте

set -o functrace

См. Страницу руководства для bash для других опций отладчика.

4 голосов
/ 14 сентября 2011

Я не могу воспроизвести вашу проблему, на самом деле, учитывая мой тестовый скрипт (debug.sh):

[root ~]# cat debug.sh
#!/bin/bash
fun01 () {
echo "BUT HERE I am inside the function fun01() body"
}
echo "HERE I am outside the function fun01() body!"
sleep 2
fun01
exit

Я запускаю его с отключенной опцией отладки:

[root ~]# ./debug.sh
HERE I am outside the function fun01() body!
BUT HERE I am inside the function fun01() body

и включен (bash -x ...):

[root ~]# bash -x ./debug.sh
+ echo 'HERE I am outside the function fun01() body!'
HERE I am outside the function fun01() body!
+ sleep 2
+ fun01
+ echo 'BUT HERE I am inside the function fun01() body'
BUT HERE I am inside the function fun01() body
+ exit

Насколько я вижу, строка, выполняемая внутри функции fun01 (), показана с начальным +, который является отладчиком в действии.

@ bash-o-logist Даже если я добавлю переменную или условные конструкции if / then / else, я все равно получу всю информацию отладки:

[root@ ~]# cat debug-new.sh
#!/bin/bash
fun01 () {
INSIDEVAR='Never really use this one'
echo "BUT HERE I am inside the function fun01() body"
if [ true ] ; then echo 'this is going to be printed always!' ; fi
}
echo "HERE I am outside the function fun01() body!"
sleep 2
fun01
exit

Выполнение снова:

[root@ ~]# bash -x debug-new.sh
+ echo 'HERE I am outside the function fun01() body!'
HERE I am outside the function fun01() body!
+ sleep 2
+ fun01
+ INSIDEVAR='Never really use this one'
+ echo 'BUT HERE I am inside the function fun01() body'
BUT HERE I am inside the function fun01() body
+ '[' true ']'
+ echo 'this is going to be printed always!'
this is going to be printed always!
+ exit
2 голосов
/ 14 сентября 2011

В ksh используйте typeset -ft function-name для трассировки в функцию

0 голосов
/ 28 октября 2018

Вот как я заставляю отладку включать или выключать функциональные блоки в скриптах bash.

Если при запуске сценария включена отладка, он включается внутри функциональных блоков. Каждый функциональный блок имеет начальное и конечное сообщение для более легкой трассировки.

Это для отладки во время выполнения. Лучше всего перенаправить вывод в файл журнала для последующего анализа, например,

bash -x ./runtime_bash_debugging>log 2>&1
-- or --
./runtime_bash_debugging>log 2>&1

Пример вывода с включенной отладкой в ​​начале

$ bash -x ./runtime_bash_debugging.sh
+ run_me_first
+ FN_NAME=run_me_first
+ MSG='BEGINNING OF: run_me_first'
+ test '' = on
++ date
+ echo 'I run first, it'\''s Sat Oct 27 19:11:06 MDT 2018'
I run first, it's Sat Oct 27 19:11:06 MDT 2018
+ MSG='END OF: run_me_first'
+ test '' = on
+ run_me_second
+ FN_NAME=run_me_second
+ MSG='BEGINNING OF: run_me_second'
+ test '' = on
+ echo 'I run second, my PID is 5744'
I run second, my PID is 5744
+ MSG='END OF: run_me_second'
+ test '' = on
+ echo Goodbye
Goodbye
+ exit

Пример вывода с отладкой в ​​начале

$ ./runtime_bash_debugging.sh
I run first, it's Sat Oct 27 19:11:09 MDT 2018
I run second, the PID is 4784
Goodbye

СКРИПТ

#!/bin/bash

# runtime bash debugging

fn_check_xtrace() {
    XTRACE_BEGIN_STATE=`set -o|awk '$1=="xtrace"{print $2}'`
    echo "${XTRACE_BEGIN_STATE}"
}


function run_me_first() {
    FN_NAME="run_me_first"
    MSG="BEGINNING OF: ${FN_NAME}"

    if test "${XTRACE_BEGIN_STATE}" = "on"
    then
    set -x
    fi

    echo "I run first, it's `date`"

    MSG="END OF: ${FN_NAME}"

    if test "${XTRACE_BEGIN_STATE}" = "on"
    then
    set -x
    fi
}


function run_me_second() {
    FN_NAME="run_me_second"
    MSG="BEGINNING OF: ${FN_NAME}"

    if test "${XTRACE_BEGIN_STATE}" = "on"
    then
    set -x
    fi

    echo "I run second, the PID is $$"

    MSG="END OF: ${FN_NAME}"

    if test "${XTRACE_BEGIN_STATE}" = "on"
    then
    set -x
    fi
}

run_me_first

run_me_second

echo "Goodbye"

exit
0 голосов
/ 16 февраля 2014

У меня был похожий вопрос, и я закончил писать свой собственный дебаггер для Bash. Попытайся! ... надеюсь это тебе поможет https://sourceforge.net/projects/bashdebugingbash/

...