我创造了两个陷阱
trap function1 DEBUG
trap pwd ERR
function function1 {
echo $BASH_COMMAND
}
如果我使用一些错误的命令a
,那么输出是->
a
bash: a: command not found
a
/home/user/dir
那么第二次调用DEBUG来执行pwd
,但是为什么$BASH_COMMAND还是a呢?有什么办法可以知道 function1 中的函数调用是在执行命令时进行的trap ERR
吗?
编辑
两个陷阱是
trap -- 'f' DEBUG
trap -- 's' ERR
function f
{
echo "inside function f command is $BASH_COMMAND"
}
function s
{
echo "inside function s command is $BASH_COMMAND"
}
错误命令的输出a
是
inside function f command is a
bash: a: command not found
inside function f command is a
inside function s command is echo "inside function s command is $BASH_COMMAND"
第二个inside function f command is a
,必须来自 ERR 陷阱。
答案1
这可以在bash
文档中找到(请参阅您的man bash
),其中在多个地方写了有关trap
.
BASH_COMMAND
当前正在执行或即将执行的命令,除非 shell 正在执行作为陷阱结果的命令,在这种情况下,它是在陷阱时执行的命令。
并且
和陷阱 [...] 不会被继承,除非该函数已被赋予属性[...] 或已使用 set 内置函数启用了 shell 选项(在这种情况下,所有函数都会继承
DEBUG
和陷阱)RETURN
trace
-o functrace
DEBUG
RETURN
如果稍微修改trap
一下命令,您可以更清楚地看到这一点
trap 'echo "##DEBUG## $BASH_COMMAND"' DEBUG
trap 'echo "##ERR## $PWD"' ERR
a
##DEBUG## a
-bash: a: command not found
##DEBUG## a
##ERR## /home/roaima
和
f() { printf "%s..." "We are in function f()"; sleep 1; printf " OK\n"; }
f
##DEBUG## f
We are in function f()... OK