トラップを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 a
ERRトラップから出てくるはずです。
答え1
bash
これについては文書(あなたの文書を参照)で見つけることができ、man bash
多くの場所で説明されていますtrap
。
BASH_COMMAND
現在実行中またはすぐに実行されるコマンドです。ただし、シェルがトラップの結果としてコマンドを実行する場合は、トラップ時に実行されたコマンドです。
そして
トラップ[...]は、関数に[...]属性が指定されていないか、組み込み関数設定を使用してシェルオプションが有効になっていない限り継承されません(この場合、すべての関数は継承
DEBUG
およびトラップされます)。RETURN
trace
-o functrace
DEBUG
RETURN
コマンドを少し変更すると、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