我的问题与我正在执行这些任务的 Ubuntu 20.04 有关。
我目前将一些状态信息传递给调试陷阱,例如 $BASH_COMMAND、$LINENO 和 $?。我也想将命令生成的任何标准错误消息传递给陷阱函数。 $?可能无效,因为它将是前一条指令的返回代码而不是当前指令,因为当前指令尚未执行。 $?并且在执行命令后,stderr 消息可能应该传递给 ERR 陷阱函数。以下链接开始了关于这个问题的思考过程:我可以为执行的每条指令以通用方式将 2> 重定向到变量吗?
如果是这样,我也可以将包含最后一条 stderr 消息的变量传递给我的 ERR 陷阱函数。不幸的是,我不知道如何以这样一种方式执行到变量的重定向,以便能够同时将最后一个命令的命令、行号、返回代码和标准错误消息全部放在一个地方调用陷阱函数。
也许有一种方法可以使用子 shell、源、函数名称和行号(也可能是命令)将 stderr 重定向到唯一名称的非附加文件,在陷阱函数启动后可以读取该文件。在这种情况下,最好将这些文件写入内存并以自动方式清除,而不是写入磁盘(SSD 或 RUST)。创建+删除这些文件将导致相当大的开销。
考虑到上述所有的缺点,您认为那些控制添加 bash 特殊变量的人会考虑一个可能与 $ 相关的 $% 的新变量吗?保存 stderr 消息传递给 ERR 陷阱可能是更好的答案吗?也许已经有这样一个变量,但我还没有找到它的名字
谢谢
调试陷阱的骨架
fxTrapDEBUG()
{
set -x
local lBashCommand="$1"
local lLineNo="$2"
set +x
}
trap 'fxTrapDEBUG "$BASH_COMMAND" "$LINENO"' DEBUG
ERR(错误)陷阱的骨架
fxTrapERROR()
{
set -x
local lBashCommand="$1"
local lLineNo="$2"
local lReturnCode="$3"
local lStdErrMsg="$4"
set +x
}
trap 'fxTrapERROR "$BASH_COMMAND" "$LINENO" "$?" "???"' ERR
我的问题是我该用什么来代替“???”多于。