让 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

但是,如果我运行 and/or 列表,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

有没有办法让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

相关内容