在 Bash 脚本中检查卷是否已安装的最佳方法是什么?

在 Bash 脚本中检查卷是否已安装的最佳方法是什么?

在 Bash 脚本中检查卷是否已安装的最佳方法是什么?

我真正想要的是一种可以像这样使用的方法:

if <something is mounted at /mnt/foo> 
then
   <Do some stuff>
else
   <Do some different stuff>
fi

答案1

避免使用,/etc/mtab因为它可能不一致。

避免使用管道,mount因为它不需要那么复杂。

简单地:

if grep -qs '/mnt/foo ' /proc/mounts; then
    echo "It's mounted."
else
    echo "It's not mounted."
fi

(后面的空格/mnt/foo是为了避免匹配例如/mnt/foo-bar。)

答案2

if mountpoint -q /mnt/foo 
then
   echo "mounted"
else
   echo "not mounted"
fi

或者

mountpoint -q /mnt/foo && echo "mounted" || echo "not mounted"

答案3

findmnt -rno SOURCE,TARGET "$1"避免了其他答案中的所有问题。它只用一个命令就能干净利落地完成工作。


其他方法有以下缺点:

  • grep -q并且grep -s是额外的不必要的步骤并且并不是到处都支持。
  • /proc/\*并非所有地方都支持。(mountpoint也是基于 proc)。
  • mountinfo基于 /proc/..
  • cut -f3 -d' '路径名中的空格混乱
  • 解析的空格有问题。它的手册页现在显示:

.. 列表模式仅是为了向后兼容而保留的。

为了获得更强大和可定制的输出使用查找(8),尤其是在你的剧本中。


Bash 函数:

#These functions return exit codes: 0 = found, 1 = not found

isDevMounted () { findmnt --source "$1" >/dev/null;} #device only
isPathMounted() { findmnt --target "$1" >/dev/null;} #path   only
isMounted    () { findmnt          "$1" >/dev/null;} #device or path

#使用示例:

if  isDevMounted "/dev/sda10";
   then echo "device is mounted"
   else echo "device is not mounted"
fi

if isPathMounted "/mnt/C";
   then echo   "path is mounted"
   else echo   "path is not mounted"
fi

#Universal (device OR path):
if isMounted     "/dev/sda10";
   then echo "device is mounted"
   else echo "device is not mounted"
fi

if isMounted     "/mnt/C";
   then echo   "path is mounted"
   else echo   "path is not mounted"
fi

答案4

以下是我在我的一个 rsync 备份 cron-jobs 中使用的内容。它会检查 /backup 是否已安装,如果未安装则尝试安装它(它可能会失败,因为驱动器位于热插拔托架中,甚至可能不在系统中)

注意:以下内容仅适用于 Linux,因为它会 greps /proc/mounts - 更便携的版本将运行“mount | grep /backup”,如 Matthew 的回答中所述。

  如果 !grep -q /backup /proc/mounts ; 那么
    如果 ! mount /backup ; 那么
      回显“失败”
      出口 1
  回显“成功”。
  # 在这里做事情

相关内容