web-dev-qa-db-ja.com

および/またはリストに対して1回だけ実行するbashDEBUGトラップを取得しますか?

次のように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トラップを実行する方法はありますか?そうでない場合、プロンプトが最後に描画されてからトラップコードがすでに実行されているかどうかを検出するための最良の方法は何ですか?

3
Richard Hansen

以下は機能しますが、少しぎこちなく感じます(もっと賢い答えを期待しています):

Prompt_COMMAND='at_Prompt=t'
trap '
    [ -z "${at_Prompt+set}" ] ||
    printf %s\\n "most recent history line: $(history 1)" >&2
    unset at_Prompt
' DEBUG
3
Richard Hansen