Bash 陷阱错误 $BASH_COMMAND

Bash 陷阱错误 $BASH_COMMAND

我创造了两个陷阱

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和陷阱)RETURNtrace-o functraceDEBUGRETURN

如果稍微修改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

相关内容