You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在磁盘未挂载时退出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 14:28:12