バッシュトラップエラー $BASH_COMMAND

バッシュトラップエラー $BASH_COMMAND

トラップを2つ作りました。

trap function1 DEBUG
trap pwd ERR
function function1 {
echo $BASH_COMMAND
}

無効なコマンドを使用すると、a出力は->です。

a
bash: a: command not found
a
/home/user/dir

次に、2番目にDEBUGを呼び出して実行しますが、pwd$BASH_COMMANDがまだaであるのはなぜですか?コマンドの実行時にfunction1の関数呼び出しが行われたかどうかを知る方法はありますかtrap ERR

編集する

罠は二つだ。

trap -- 'f' DEBUG
trap -- 's' ERR
function f 
{ 
    echo "inside function f command is $BASH_COMMAND"
}
function s 
{ 
    echo "inside function s command is $BASH_COMMAND"
}

無効なコマンドの出力はa次のとおりです。

inside function f command is a
bash: a: command not found
inside function f command is a
inside function s command is echo "inside function s command is $BASH_COMMAND"

2番目はinside function f command is aERRトラップから出てくるはずです。

答え1

bashこれについては文書(あなたの文書を参照)で見つけることができ、man bash多くの場所で説明されていますtrap

BASH_COMMAND 現在実行中またはすぐに実行されるコマンドです。ただし、シェルがトラップの結果としてコマンドを実行する場合は、トラップ時に実行されたコマンドです。

そして

トラップ[...]は、関数に[...]属性が指定されていないか、組み込み関数設定を使用してシェルオプションが有効になっていない限り継承されません(この場合、すべての関数は継承DEBUGおよびトラップされます)。RETURNtrace-o functraceDEBUGRETURN

コマンドを少し変更すると、trapより明確に表示されます。

trap 'echo "##DEBUG## $BASH_COMMAND"' DEBUG
trap 'echo "##ERR## $PWD"' ERR

a
##DEBUG## a
-bash: a: command not found
##DEBUG## a
##ERR## /home/roaima

そして

f() { printf "%s..." "We are in function f()"; sleep 1; printf " OK\n";  }
f
##DEBUG## f
We are in function f()... OK

関連情報