linux - 如果命令失败,不中断脚本,但收集退出代码

标签 linux bash

我需要在设置了 set -e 的脚本中执行命令。此命令是一般脚本流程的一个异常(exception),因为它可能会失败,但这并不重要:脚本可以继续。我希望该命令中断脚本;相反,我想保留退出代码以供以后评估。

我想出了以下脚本:

#!/bin/bash

set -e
false && res1=$? || res1=$?
true  && res2=$? || res2=$?
echo $res1
echo $res2

(我的命令将代替 falsetrue)

这是正确的方法吗?

编辑

顺便说一句,这个非常相似的构造根本不起作用:

#!/bin/bash

set -e
false || res1=$? && res1=$?
true  || res2=$? && res2=$?
echo $res1
echo $res2

编辑

测试其中一个建议:

#!/bin/bash

set -e
false || { res1=$?; true; }
true  || { res2=$?; true; }
echo $res1
echo $res2

这是行不通的。结果是:

1
(empty line)

最佳答案

不要尝试使用&&|| 来组成三元表达式;它太脆弱了。只需使用 if 语句即可。

if cmd; then res=$?; else res=$?; fi

更好(?)的是,您可以将赋值放在条件本身中,以看似空洞的 if 语句为代价减少重复:

if cmd; res=$?; then :; fi

虽然用单个 || 可能写得更清楚:

{ cmd; res=$?; } || true

(请注意,我交替使用了 true:;POSIX 保证 : 是一个内置的 shell,但是 true 可能更具可读性。)

关于linux - 如果命令失败,不中断脚本,但收集退出代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40547498/

相关文章:

bash - 如何根据列值将 CSV 文件拆分为多个文件

linux - "cat a | cat b"忽略a的内容

python - 无法在Python中使用子流程模块(无此类文件)

mysql - 如何在redhat linux上运行mysql v5.5

python - 如何永久添加 Python 导入路径?

linux - 使用 SSH grep 来自多个服务器的关键字

linux - 作为守护进程的 Php 脚本

php - 从 PHP 写入十六进制到串口

c++ - 每当调用 malloc/free 时输出到 stderr

mysql - 是否有一个脚本来解析 radius 会计平面文件以导出到单独的 mysql 服务器