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
ただし、および/またはリストを実行すると、実行さDEBUG
れる各リストコマンドに対して1回、トラップが複数回呼び出されます。
$ echo foo && echo bar
most recent history line: 483 echo foo && echo bar
foo
most recent history line: 483 echo foo && echo bar
bar
DEBUG
プロンプトに入力された各コマンド(単純またはその他)に対してトラップを一度だけ実行する方法はありますか?そうでない場合、最後にプロンプトが描画された後にトラップコードが実行されたかどうかを検出する最良の方法は何ですか?
答え1
次はうまくいきますが、少し混乱しています(もっと賢い答えが欲しかった)。
PROMPT_COMMAND='at_prompt=t'
trap '
[ -z "${at_prompt+set}" ] ||
printf %s\\n "most recent history line: $(history 1)" >&2
unset at_prompt
' DEBUG