2011-09-14 35 views
7

bash:デバッグオプションと関数

bash -x myscript.sh 

を実行すると、デバッグ出力が得られます。

しかし、myscript.shに関数がある場合、その関数のコードは-xオプションの影響を受けません。関数の名前だけを出力するように書き込みます。

bashスクリプトで関数のデバッグ出力を取得する方法は?

アップデート:

ztank1013のレスポンスに続いて、私はbashではなくkshを使用していることに気付きました。私のシステムでは、デフォルトで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に行きます)

+0

良い質問、+1 – nsd

答えて

8

のbashで、あなたは用スクリプト

set -o functrace 

参照のmanページにfunctraceオプションを使用することができます他のデバッガオプションについては3210を参照してください。

4

私はあなたの問題を再現することはできません、実際には私のテストスクリプト(debug.sh)与えられた:

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

と(bashの-x ...)オン:

[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 ~]# 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条件構造ならば、私はまだ、すべてのデバッグ情報を取得:

[[email protected] ~]# 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 

が再び実行:

[[email protected] ~]# 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 
+1

あなたは関数内にいくつかの文をエコーすることはできません。変数を宣言し、関数内でif/elseを使用してみてください。 –

+0

+1を助けてください –

2

は機能

+0

このコマンドの使用方法は?私は外でスクリプトを試しましたが、成功しませんでした... –

+0

@FlorinGhitaはスクリプトの中で、* 'function-name' *をデバッグ中の関数の名前に置き換えています。 – yarek

0

にトレースするのksh使用typeset -ft function-nameで、私は同様の質問があったと私はBashのための私自身のdebbugerを書くに終わりました。それを試してみてください! ...私はそれがあなたを助けることを願っていますhttps://sourceforge.net/projects/bashdebugingbash/

+0

あなたのコードへのリンクではなく、あなたのコードをここに投稿してください。 –

+0

スクリーンショットが有望に見えるが、動作しません '' ' 1は、/ usr/share/BDBの$ PWD を/ usr/share/BDB 1は、/ usr/share/BDB bdbINCのための$ ./bdb.sh + INC中/ bdb.lang INC/bdb.vars INC/bdb.lib + INCFICH =を/ usr/share/BDB/INC/bdb.lang +植字-u INCUPR = INC/bdblang + INCFLAG = INC/BDBLANG_INCLUDE ./bdb .sh:行29:INC/BDBLANG_INCLUDE:不正な置換 +終了 '' ' 私のスペイン語はあなたのコードを理解するにはあまりにも面倒です –

関連する問題