bash DEBUGトラップがおよび/またはリストに対して一度だけ実行されるようにしますか?

bash DEBUGトラップがおよび/またはリストに対して一度だけ実行されるようにしますか?

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

おすすめ記事