bash - 通过 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 |
) 中。
推荐阅读
- javascript - 从 onclick 按钮事件向选项卡添加活动类
- list - 如何在剃刀视图中显示 Orchard Core CMS 的 ListPart 项?
- stored-procedures - JdbcTemplate 调用存储过程调用
- ios - 在特定日期使用 Timer 调用函数
- java - HashMap 的 Java Getter
- c++ - 使用引用的类字符串设置器
- powershell - 我可以使用 Invoke-WebRequest 将二进制数据写入文件并仍然获得状态码吗?
- xcode - 在 xcode-select --install 之后收到警报“由于网络问题无法下载软件”
- javascript - 即使在推送数据后,节点 js 也会得到空白 obj
- r - 如何使用 R 在时间序列图中输入天数?