我正在使用
mount -o bind /some/directory/here /foo/bar
我想用bash脚本检查/foo/bar
,看看它是否已经挂载?如果没有,则调用上面的mount命令,否则执行其他操作。我怎么能这样做?
CentOS是操作系统。
答案 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/mounts
或mount
输出中的路径为/path/to/dir
/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"