我在用
mount -o bind /some/directory/here /foo/bar
我想/foo/bar
用bash脚本检查一下,看看是否已挂载?如果不是,则调用上面的mount命令,否则执行其他操作。我怎样才能做到这一点?
CentOS是操作系统。
我在用
mount -o bind /some/directory/here /foo/bar
我想/foo/bar
用bash脚本检查一下,看看是否已挂载?如果不是,则调用上面的mount命令,否则执行其他操作。我怎样才能做到这一点?
CentOS是操作系统。
Answers:
运行mount
不带参数的命令将告诉您当前的安装。从shell脚本中,您可以使用grep
和if语句检查安装点:
if mount | grep /mnt/md0 > /dev/null; then
echo "yay"
else
echo "nay"
fi
在我的示例中,if语句正在检查的退出代码grep
,该代码指示是否存在匹配项。由于我不希望在匹配时显示输出,因此将其重定向到/dev/null
。
grep
如果没有匹配项,则返回非零退出状态。不需要测试,也不需要$()创建的子外壳。if command | grep -q 'stuff'; then ...
mount | grep ...
向您显示安装绑定仍处于活动状态。如果卸载并重新安装了底层设备,即使mount
仍然显示已连接,安装绑定实际上将不再连接两个文件/目录。如果这样做,umount ...
它甚至会告诉您它尚未安装,尽管mount
它说是。linux文件系统中的巨大缺陷。
readlink -f
,当路径/文件不存在时,它不会返回任何内容。如果底层的/ mount / path / to_file不存在(按每个readlink),则底层的装载将中断(重新装载底层的装载和绑定)。如果基础文件在那里,并且readlink -f
说该文件的绑定版本不存在,则绑定被破坏,只需重新安装绑定即可。
/mnt/md0xxx
那么该命令将指示/mnt/md0
已安装文件,而不必安装它...
您不必费心提到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
希望能有所帮助。
的手册mountpoint
说:
检查是否在/ proc / self / mountinfo文件中提到了给定的目录或文件。
的手册mount
说:
维护列表模式仅是为了向后兼容。对于更健壮和可定制的输出,请使用findmnt(8),尤其是在脚本中。
因此,正确使用的命令是findmnt
,它本身是util-linux
软件包的一部分,并且根据手册:
能够在/ etc / fstab,/ etc / mtab或/ proc / self / mountinfo中搜索
因此,它实际上搜索的内容比还要多mountpoint
。它还提供了方便的选项:
-M,--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"
我喜欢使用的答案/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
mountpoint
或findmnt
存在。非常简单的答复,非常高兴,例如UNIX :)
我的解决方案:
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的答案,mountpoint
如果bind
在其他文件系统中使用选项挂载,则不起作用。
对于Christopher Neylan的答案,不需要将grep的输出重定向到/ dev / null,而只需使用grep -q
。
最重要的是,通过使用规范化路径readlink -f $mypath
:
/path/to/dir/
以反斜杠结尾),则输入/proc/mounts
或mount
输出为/path/to/dir
/var/run/
是符号链接/run/
,因此,如果您安装了绑定/var/run/mypath
,并检查它是否安装,它会显示为/run/mypath
在/proc/mounts
。另一个干净的解决方案是这样的:
$ mount | grep /dev/sdb1 > /dev/null && echo mounted || echo unmounted
可以肯定的是,“回声某事”可以用每种情况下需要做的任何事情代替。