我需要在设置了 set -e
的脚本中执行命令。此命令是一般脚本流程的一个异常(exception),因为它可能会失败,但这并不重要:脚本可以继续。我希望该命令不中断脚本;相反,我想保留退出代码以供以后评估。
我想出了以下脚本:
#!/bin/bash
set -e
false && res1=$? || res1=$?
true && res2=$? || res2=$?
echo $res1
echo $res2
(我的命令将代替 false
或 true
)
这是正确的方法吗?
编辑
顺便说一句,这个非常相似的构造根本不起作用:
#!/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/