たかまるの雑記

たまに更新

シェルで関数のトレース表示(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
$

関数の中はトレースされない


修正する

  1. トレース表示用の__trace__関数をつくる
  2. スクリプトファイルから関数名をとる
  3. とってきた関数に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だと、関数をfunctionname()で定義した場合で
トレースの表示あり/なしが違うみたい。

関数の呼び出しもとで-xをつけたとき、

  • functionで定義した関数のトレースは表示されない
  • name()で定義した関数のトレースは表示される