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