通过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 |) 中。


以上是通过eval和function保留bash返回码的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>