在 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 菲 菲 回显“成功”。 # 在这里做事情