Bash中如何优雅设置退出状态以执行后续命令?
优雅替代子shell设置退出码的写法
想要替代bash -c "exit $a" && echo foo这种冗余的子shell写法,最符合你要求的优雅方案是利用POSIX兼容的条件判断命令,直接检查$a的值是否为0(因为shell中退出码0代表成功,非0代表失败,和exit $a的逻辑完全匹配):
[ "$a" -eq 0 ] && echo foo
为什么这个写法更优?
- 无冗余子shell:
[是shell内置命令(很多shell里它是test的别名),不需要启动新的子进程,性能更好,也更简洁。 - 完全匹配原逻辑:当
$a为0时,[ "$a" -eq 0 ]返回退出码0(成功),后续&& echo foo会执行;当$a为非0值时,条件判断返回非0,echo foo不会执行,和你原来的bash -c "exit $a" && echo foo效果完全一致。 - 可移植性强:符合POSIX标准,在bash、sh、zsh等主流shell中都能正常工作。
- 可读性高:一眼就能看懂是在判断
$a是否为0,逻辑清晰,编写也简单。
为什么其他尝试的写法不行?
return $a && echo foo:return是用于函数或脚本内部返回退出码的命令,在主shell环境中直接用会报错,不符合你的使用场景。exit $a && echo foo:exit会直接终止当前shell进程,不管$a是什么值,后面的echo foo都永远没有机会执行,完全不符合需求。
备选写法(如果偏好算术表达式风格)
如果你习惯用bash的算术表达式语法,也可以写成:
(( a == 0 )) && echo foo
这个写法在bash和zsh中有效,但注意它不是POSIX严格兼容的(比如在sh中可能无法运行),如果需要极致的可移植性,还是优先用[ "$a" -eq 0 ]的写法。
内容的提问来源于stack exchange,提问作者Ole Tange
相关产品推荐
相关产品推荐

