如何在磁盘未挂载时退出Bash备份脚本?
备份脚本挂载检测问题解析
问题一:为什么echo能执行但exit 1无法退出脚本?
你用()包裹命令的写法会创建一个子shell。子shell是独立于主脚本的运行环境:
- 子shell里的
echo命令执行后,输出会传递到主终端,但子shell结束后主脚本继续运行; - 而
exit 1只是退出了这个子shell,根本不会影响主脚本的执行流程,所以主脚本会继续往下跑,看起来就像“没退出”。
问题二:如何可靠实现磁盘未挂载时退出脚本?
推荐几种靠谱的写法,核心是避免创建子shell,直接在主shell环境里执行退出命令:
方案1:用大括号{}替代小括号()
大括号不会创建子shell,命令直接在当前shell执行:
findmnt "$BACKUP_DRIVE" >/dev/null || { echo "Drive not found." exit 1 }
注意语法细节:{后面必须加空格,}前面要加换行或者分号;同时给变量$BACKUP_DRIVE加上双引号,避免路径包含空格时出错。
方案2:用if语句判断(可读性更强)
直接判断findmnt的退出状态,逻辑更清晰:
if ! findmnt "$BACKUP_DRIVE" >/dev/null; then echo "Drive not found." exit 1 fi
你之前用! [ findmnt ... ]报错,是因为[(即test命令)是用来做条件判断的工具,不能直接嵌套外部命令。要判断命令的执行结果,直接用! 命令即可,不需要加[ ]。
方案3:使用mountpoint命令(更精准检测挂载点)
如果BACKUP_DRIVE是挂载点路径,可以用mountpoint命令直接检测:
if ! mountpoint -q "$BACKUP_DRIVE"; then echo "Drive not found." exit 1 fi
-q参数让命令静默执行,只返回退出码,不会输出额外内容。
内容的提问来源于stack exchange,提问作者lyndhurst
相关产品推荐
相关产品推荐

