#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
#!/bin/bash
if [[ $(stat -c "%d" /mnt) -ne $(stat -c "%d" /mnt/foo) ]]; then
echo "Somethin mounted there I reckon"
fi
我的逻辑有一个缺陷......
作为一个函数:
#!/usr/bin/bash
function somethingMounted {
mountpoint="$1"
if ! device1=$(stat -c "%d" $mountpoint); then
echo "Error on stat of mount point, maybe file doesn't exist?" 1>&2
return 1
fi
if ! device2=$(stat -c "%d" $mountpoint/..); then
echo "Error on stat one level up from mount point, maybe file doesn't exist?" 1>&2
return 1
fi
if [[ $device1 -ne $device2 ]]; then
#echo "Somethin mounted there I reckon"
return 0
else
#echo "Nothin mounted it seems"
return 1
fi
}
if somethingMounted /tmp; then
echo "Yup"
fi
awk -v status=1 '$2 == "/opt" {status=0} END {exit status}' /proc/mounts
# and you can use it in and if like so:
if awk -v status=1 '$2 == "/opt" {status=0} END {exit status}' /proc/mounts; then
echo "yes"
else
echo "no"
fi
避免使用
/etc/mtab
,因为它可能不一致。避免管道
mount
,因为它不需要那么复杂。简单地:
(后面的空格
/mnt/foo
是为了避免匹配例如/mnt/foo-bar
。)或者
findmnt -rno SOURCE,TARGET "$1"
避免了其他答案中的所有问题。它只用一个命令就可以完成这项工作。其他方法有以下缺点:
grep -q
并且grep -s
是一个额外的不必要的步骤,并非所有地方都支持。/proc/\*
并非所有地方都支持。(mountpoint
也基于proc)。mountinfo
基于/proc/..cut -f3 -d' '
弄乱路径名中的空格重击功能:
#使用示例:
像这样的脚本永远不会是可移植的。unix 中的一个肮脏秘密是只有内核知道文件系统在哪里,并且缺少像 /proc (不可移植)这样的东西,它永远不会给你一个直接的答案。
我通常使用 df 来发现子目录的挂载点是什么,以及它所在的文件系统。
例如(需要 posix shell,如 ash / AT&T ksh / bash / 等)
有点告诉你有用的信息。
以下是我在我的 rsync 备份 cron 作业之一中使用的内容。它会检查 /backup 是否已安装,如果没有则尝试安装它(它可能会失败,因为驱动器位于热插拔托架中,甚至可能不存在于系统中)
注意:以下仅适用于 linux,因为它 greps /proc/mounts - 更便携的版本将运行 'mount | grep /backup',就像马修的回答一样。
因为为了挂载,无论如何你都需要有一个目录,它会被挂载,所以我的策略总是创建一个永远不会使用的奇怪文件名的伪造文件,然后检查它是否存在。如果文件在那里,那么那个地方没有安装任何东西......
我认为这不适用于安装网络驱动器或类似的东西。我将它用于闪存驱动器。
比较设备编号怎么样?我只是想想想最深奥的方法..
我的逻辑有一个缺陷......
作为一个函数:
回显错误消息可能是多余的,因为 stat 也会显示错误。
此脚本将检查驱动器是否已安装且实际可用。它可以写得更紧凑,但我更喜欢这样简单,因为我对 Bash 不太熟悉。您可能想要更改超时,它设置为 10 秒。在脚本中。
我喜欢使用的答案
/proc/mounts
,但我不喜欢做一个简单的 grep。这会给你带来误报。您真正想知道的是“是否任何行都具有字段号 2 的确切字符串”。所以,问这个问题。(在这种情况下,我正在检查/opt
)这些都不满足给定目录是另一个挂载点中的子目录的用例。例如,您可能有 /thing,它是一个 NFS 挂载到 host:/real_thing。为此目的在 /proc/mounts /etc/mtab 或“mount”上使用 grep 将不起作用,因为您将寻找一个不存在的安装点。例如,/thing/thingy 不是挂载点,但 /thing 挂载在 host:/real_thing 上。这里投票的最佳答案实际上不是“确定目录/卷是否已安装的最佳方法”。我会投票赞成使用“df -P”(-P POSIX 标准模式)作为更清洁的策略:
运行它的输出将是:
如果你想知道真正的挂载点是什么,没问题:
该命令的输出将是:
如果您试图通过任意目录或文件列表创建某种 chroot 来镜像 chroot 外部、chroot 内的挂载点,这一切都非常有用。