次のようにDEBUG
にトラップを設定するとします。
unset Prompt_COMMAND # don't want $Prompt_COMMAND triggering DEBUG trap
trap 'printf %s\\n "most recent history line: $(history 1)" >&2' DEBUG
単純なコマンドを実行すると、コマンドがstderrに出力されます。
$ echo foo
most recent history line: 483 echo foo
ただし、および/またはリストを実行すると、実行されたリストコマンドごとに1回、DEBUG
トラップが複数回呼び出されます。
$ echo foo && echo bar
most recent history line: 483 echo foo && echo bar
foo
most recent history line: 483 echo foo && echo bar
bar
プロンプトで入力されたコマンド(単純またはその他)ごとに1回だけDEBUG
トラップを実行する方法はありますか?そうでない場合、プロンプトが最後に描画されてからトラップコードがすでに実行されているかどうかを検出するための最良の方法は何ですか?
以下は機能しますが、少しぎこちなく感じます(もっと賢い答えを期待しています):
Prompt_COMMAND='at_Prompt=t'
trap '
[ -z "${at_Prompt+set}" ] ||
printf %s\\n "most recent history line: $(history 1)" >&2
unset at_Prompt
' DEBUG