如何测试给定路径是否为挂载点

And*_*cia 35 unix bash shell

假设你想要测试/ mnt/disk是否是shell脚本中的挂载点.你怎么做到这一点?

And*_*cia 52

我发现在我的Fedora 7上有一个mountpoint命令.

从man mountpoint:

NAME
       mountpoint - see if a directory is a mountpoint

SYNOPSIS
       /bin/mountpoint [-q] [-d] /path/to/directory
       /bin/mountpoint -x /dev/device
Run Code Online (Sandbox Code Playgroud)

显然它带有sysvinit包,我不知道这个命令是否可用于其他系统.

[root@myhost~]# rpm -qf $(which mountpoint)
sysvinit-2.86-17
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`mountpoint`命令当前只是将`stat(dir)`的设备号与`lstat(dir/..)`(类似于其他答案)进行比较,如果挂载点是使用`mount挂载的话 - 它会失败 - -bind`到同一文件系统的另一部分. (8认同)
  • 解析输出/ etc/mtab的解决方案可以提供错误的答案:根文件系统可以以只读方式挂载,并且/ etc/mtab自上次启动后可能尚未更新.mount(8)通常只是打印/ etc/mtab的内容,并且出于同样的原因会给出错误的答案. (2认同)

eph*_*ent 21

不依靠mount,/etc/mtab,/proc/mounts,等:

if [ `stat -c%d "$dir"` != `stat -c%d "$dir/.."` ]; then
    echo "$dir is mounted"
else
    echo "$dir is not mounted"
fi
Run Code Online (Sandbox Code Playgroud)

何时$dir是挂载点,它的设备编号与其父目录不同.

到目前为止列出的替代方案的好处是你不必解析任何东西,并且它做正确的事情dir=/some//path/../with///extra/components.

缺点是它没有标记/为挂载点.嗯,这对于特殊情况来说很容易,但仍然如此.

  • 这似乎不适用于mount -bind挂载点.安装或未安装_if_始终为false._即使使用stat -c%d_也不起作用 - 这也在RHEL上. (3认同)
  • +1 ...仅供参考我不得不使用'stat -c%d"/ path"'而不是你描述的选项来比较设备号.它可能只是我们系统中的一个不同; 我在RHEL 5.5上.此外,对于其他人,如果您想在程序中执行此操作,请参阅man stat(2). (2认同)

小智 5

使用GNU find

find <directory> -maxdepth 0 -printf "%D" 
Run Code Online (Sandbox Code Playgroud)

将给出目录的设备号。如果目录和它的父目录之间不同,则您有一个安装点。

加/。如果您希望链接到不同文件系统的符号链接计入挂载点(您始终希望将其用作父目录),则将其添加到目录名上。

缺点:使用GNU find的便携性较差

优点:报告未记录在/ etc / mtab中的安装点。