检查目录是否使用bash挂载

时间:2012-02-23 22:32:05

标签: linux bash centos mount

我正在使用

mount -o bind /some/directory/here /foo/bar

我想用bash脚本检查/foo/bar,看看它是否已经挂载?如果没有,则调用上面的mount命令,否则执行其他操作。我怎么能这样做?

CentOS是操作系统。

8 个答案:

答案 0 :(得分:162)

你没有提及O / S.

Ubuntu Linux 11.10(可能是最新的Linux版本)都有mountpoint命令。

以下是我的某台服务器上的示例:

$ mountpoint /oracle
/oracle is a mountpoint
$ mountpoint /bin
/bin is not a mountpoint

实际上,在您的情况下,您应该能够使用-q选项,如下所示:

mountpoint -q /foo/bar || mount -o bind /some/directory/here /foo/bar

希望有所帮助。

答案 1 :(得分:63)

运行不带参数的mount命令将告诉您当前的挂载。在shell脚本中,您可以使用grep和if语句检查挂载点:

if mount | grep /mnt/md0 > /dev/null; then
    echo "yay"
else
    echo "nay"
fi

在我的示例中,if语句正在检查grep的退出代码,该代码表示​​是否存在匹配项。由于我不希望在匹配时显示输出,因此我将其重定向到/dev/null

答案 2 :(得分:27)

mountpoint手册说明了:

  

检查/ proc / self / mountinfo文件中是否提到了给定的目录或文件。

mount的手册说:

  

维护列表模式仅用于向后兼容。对于   更强大和可定制的输出使用findmnt(8),尤其是在你的   脚本。

所以正确使用的命令是findmnt ,它本身就是util-linux包的一部分,根据手册:

  

能够搜索/ etc / fstab,/ etc / mtab或/ proc / self / mountinfo

所以它实际上搜索的内容比mountpoint更多。它还提供了方便的选项:

  

-M, - mountpoint 路径

     

明确定义mountpoint文件或目录。另见--target。

总之,要检查目录是否使用bash挂载,您可以使用:

if [[ $(findmnt -M "$FOLDER") ]]; then
    echo "Mounted"
else
    echo "Not mounted"
fi

示例:

mkdir -p /tmp/foo/{a,b}
cd /tmp/foo

sudo mount -o bind a b
touch a/file
ls b/ # should show file
rm -f b/file
ls a/ # should show nothing

[[ $(findmnt -M b) ]] && echo "Mounted"
sudo umount b
[[ $(findmnt -M b) ]] || echo "Unmounted"

答案 3 :(得分:1)

我的解决方案:

is_mount() {
    path=$(readlink -f $1)
    grep -q "$path" /proc/mounts
}

示例:

is_mount /path/to/var/run/mydir/ || mount --bind /var/run/mydir/ /path/to/var/run/mydir/

对于Mark J. Bobak's answer,如果在不同的文件系统中使用mountpoint选项挂载,则bind无效。

对于Christopher Neylan's answer,不需要将grep的输出重定向到/ dev / null,而只需使用grep -q

最重要的是,使用readlink -f $mypath 规范化路径:

  • 如果您使用反斜杠检查/path/to/dir/结尾的路径,则/proc/mountsmount输出中的路径为/path/to/dir
  • 在大多数Linux版本中,/var/run//run/的符号链接,因此如果您为/var/run/mypath安装bind并检查它是否已挂载,它将显示为/run/mypath in /proc/mounts

答案 4 :(得分:0)

另一个干净的解决方案是这样的:

$ mount | grep /dev/sdb1 > /dev/null && echo mounted || echo unmounted

当然,'echo something'可以用你需要为每种情况做的任何事情来代替。

答案 5 :(得分:0)

我喜欢使用/proc/mounts的答案,但是我不喜欢做简单的grep。那会给你带来误报。您确实想知道的是“是否有任何行都具有字段2的确切字符串”。所以,问这个问题。 (在这种情况下,我正在检查/opt

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

答案 6 :(得分:0)

这里的答案太复杂了,只需使用以下命令检查安装是否存在:

cat /proc/mounts | tail -n 1

如果您只想查看所有文件夹,则仅输出上一个挂载的文件夹。

答案 7 :(得分:-2)

在我的.bashrc中,我提出了以下别名:

alias disk-list="sudo fdisk -l"