次のスクリプトがあります。
function dbgtrap {
echo "badvar is $badvar"
}
badvar=0
function some_func {
badvar=1
badvar=2
badvar=3
}
set -o functrace
trap dbgtrap DEBUG
some_func
trap - DEBUG # turn off the DEBUG trap
スクリプトを取得した後、出力を取得しました。
badvar is 0
badvar is 0
badvar is 0
badvar is 1
badvar is 2
badvar is 3
私は次のことを期待しています:
badvar is 0
badvar is 1
badvar is 2
badvar is 3
出力の最初の2行はどこから来ましたか?
答え1
設定すると、すべてのコマンドラインでトラップが呼び出されます。下図のようにTRACEを使用して出力します。
+ badvar=0
+ set -o functrace
+ trap dbgtrap DEBUG
++ dbgtrap
++ echo 'badvar is 0'
badvar is 0
+ some_func
++ dbgtrap
++ echo 'badvar is 0'
badvar is 0
++ dbgtrap
++ echo 'badvar is 0'
badvar is 0
+ badvar=1
++ dbgtrap
++ echo 'badvar is 1'
badvar is 1
+ badvar=2
++ dbgtrap
++ echo 'badvar is 2'
badvar is 2
+ badvar=3
++ dbgtrap
++ echo 'badvar is 3'
badvar is 3
+ trap - DEBUG
IIRCシェルは処理の終わりにトラップを呼び出すため、関数呼び出しがbadvar値を出力する前に3行の出力があります。