我正在尝试使用 Trap 创建一些错误报告来调用所有错误的函数:
Trap "_func" ERR
Run Code Online (Sandbox Code Playgroud)
是否有可能获得 ERR 信号是从哪条线路发送的?外壳是 bash。
如果我这样做,我可以阅读和报告使用了什么命令并记录/执行一些操作。
或者也许我在这一切都错了?
我测试了以下内容:
#!/bin/bash
trap "ECHO $LINENO" ERR
echo hello | grep "asdf"
Run Code Online (Sandbox Code Playgroud)
并且$LINENO
正在返回 2. 不工作。
在使用set -e
( errexit
), set -u
( nounset
) 以及 ERR 和 EXIT 陷阱时,我观察到一些奇怪的行为。它们似乎相关,因此将它们放在一个问题中似乎是合理的。
set -u
不触发 ERR 陷阱代码:
#!/bin/bash
trap 'echo "ERR (rc: $?)"' ERR
set -u
echo ${UNSET_VAR}
Run Code Online (Sandbox Code Playgroud)set -e
不会改变结果set -eu
在 EXIT 陷阱中使用退出代码是 0 而不是 1代码:
#!/bin/bash
trap 'echo "EXIT (rc: $?)"' EXIT
set -eu
echo ${UNSET_VAR}
Run Code Online (Sandbox Code Playgroud)set …