シェルで関数のトレース表示(3)
トレース表示用の関数をつくることにした。
sample1.sh
#!/usr/bin/ksh function f1 { echo f1 } function f2 { echo f2 f1 }
sample2.sh
. ./sample1.sh function f3 { echo f3 f2 } f3
トレースオプションつきで実行
$ ksh -x sample2.sh + . ./sample1.sh + f3 f3 f2 f1 $
関数の中はトレースされない
修正する
- トレース表示用の
__trace__
関数をつくる - スクリプトファイルから関数名をとる
- とってきた関数に
typeset -ft
を設定する
※関数はfunction
で定義している前提
sample2.sh
$ . ./sample1.sh function f3 { echo f3 f2 } __trace__() { set - if [ ! -z "$(echo ${1:-} | sed 's/[^x]//g')" -a -r ${2:-$0} ] then r='^ *function +' for f in $(awk "/$r/"'{sub(r,"");print}' r="$r" ${2:-$0}); do typeset -ft $f; done fi set -${1:-} } __trace__ $- f3
HP-UXでは__trace__()
内のset
は不要
トレースオプションつきで実行
$ ksh -x sample2.sh + . ./sample1.sh + __trace__ hxB + f3 + echo f3 f3 + f2 f2 f1 $
関数(f3)の中もトレースされる
※HP-UXではksh
ではなくsh
でも良い
インクルードした関数のトレースも表示
f3
実行の前に__trace__ $- ./sample1.sh
を入れると、
インクルードした関数のトレースも表示される
$ ksh -x sample2.sh + . ./sample1.sh + __trace__ hxB + __trace__ hxB ./sample1.sh + f3 + echo f3 f3 + f2 + echo f2 f2 + f1 + echo f1 f1 $
関数(f2, f1)の中もトレースされる
-x
をつけないとトレースは表示されない
$ ksh sample2.sh f3 f2 f1 $
Ubuntoのksh
だと、関数をfunction
とname()
で定義した場合で
トレースの表示あり/なしが違うみたい。
関数の呼び出しもとで-x
をつけたとき、
function
で定義した関数のトレースは表示されないname()
で定義した関数のトレースは表示される