首页 > 解决方案 > 通过 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在我的脚本中保留返回码?

标签: bash

解决方案


正如您所发现的,您的实现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 |) 中。


推荐阅读