デバッグトラップに関する質問

デバッグトラップに関する質問

以下のようなスクリプトがあります:

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

私の記憶が正しければ、シェルは処理の最後にトラップを呼び出すので、badvar 値の関数呼び出し出力の前に 3 行の出力が表示されます。

関連情報