如何在bash脚本中忽略特定命令失败以避免脚本终止?
在bash中忽略指定命令的失败(类似make的
-command) 问题描述
我使用#!/bin/bash -eu运行脚本,该脚本会在出现问题时自动终止,这符合我的需求。但有时我预期某个命令会失败,希望让bash忽略该失败条件。在make中可通过便捷的-command忽略命令状态,bash中有类似方法吗?我想到的只有不够优雅的写法:set +e; command; set -e。
解决方案
当然有更简洁优雅的方式!在bash里,你只需要在预期可能失败的命令后面加上|| true(或者更简短的|| :,因为:是bash的内置空命令,始终返回成功状态码0),就能让set -e忽略这个命令的失败。
举个实际例子:
#!/bin/bash -eu # 这个命令如果失败,脚本会直接终止 ls /nonexistent-dir # 这个命令即使失败,脚本也会继续往下执行 ls /nonexistent-dir || true # 用更精简的写法效果完全一致 ls /nonexistent-dir || :
原理很直白:set -e的规则是当整个命令序列的返回值为非0时才会终止脚本。加上|| true后,就算前面的命令返回非0,true会返回0,整个序列的最终返回值就是0,脚本自然不会被终止。
对比你原来的set +e; command; set -e写法,这种方式不仅更短,还不需要临时关闭-e模式,避免了中间如果有其他意外命令失败却没被捕获的风险,安全性和可读性都更高。
内容的提问来源于stack exchange,提问作者blueFast
相关产品推荐
相关产品推荐

