通过eval和function保留bash返回码
我有一个简单的 bash 函数hle(突出显示错误),它在构建时突出显示重要文本。它的实现如下:
hle() (
set -o pipefail
"$@" 2>&1 |
sed -f $hldir/red.sed -f $hldir/blue.sed -f $hldir/orange.sed
)
所以你可以运行hle make target,所有错误都显示为红色,警告为橙色,调试为蓝色
现在,我有一个执行以下操作的脚本:
foo.sh:
eval hle $command
[ $? ] && echo "SUCCESS"
但这并不$?代表 eval 的返回代码(我相信这是 hle 本身的返回代码......)我将如何保留$command脚本中的返回代码?
回答
正如您所发现的,您的实现hle应该已经产生了正确的退出代码。然而,测试[ $? ]是有缺陷的。有了[ $? = 0 ]它应该达到预期效果。
然而,这是一个hle不需要更改set -o选项的替代实现,因此也不需要子 shell:
hle() {
"$@" 2>&1 |
sed -f "$hldir/red.sed" -f "$hldir/blue.sed" -f "$hldir/orange.sed"
return "${PIPESTATUS[0]}"
}
对于eval,退出状态是评估命令的退出状态,请参阅bash 的手册:
eval [arguments]
参数连接在一起成为一个命令,然后读取和执行,其退出状态作为 eval 的退出状态返回
顺便说一句:取决于$command你根本不需要eval。知道我只能想到一种eval重要的情况,即管道(command="cmd1 | cmd2")。然而,在这样的管道中,只有第一个命令会被hle. 如果您确实需要,eval则将其放入函数 ( { eval "$@"; } 2>&1 |) 中。