检查目录是否装有bash
我在用
mount -o bind /some/directory/here /foo/bar
我想用bash脚本检查/foo/bar
,看看它是否被挂载? 如果没有,那么调用上面的安装命令,否则做别的。 我怎样才能做到这一点?
CentOS是操作系统。
不带参数运行mount
命令会告诉你当前的挂载。 从shell脚本中,你可以用grep
和一个if语句来检查挂载点:
if mount | grep /mnt/md0 > /dev/null; then echo "yay" else echo "nay" fi
在我的例子中,if语句是检查grep
的退出代码,它表示是否匹配。 由于我不希望在匹配时显示输出,所以我将它redirect到/dev/null
。
你没有提到一个操作系统。
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
希望有所帮助。
另一个干净的解决scheme是这样的
$ mount | grep /dev/sdb1 > /dev/null && echo mounted || echo unmounted
当然,“echo something”可以replace为每种情况下你需要做的任何事情。
mountpoint
手册说:
检查给定的目录或文件是否在/ proc / self / mountinfo文件中提到。
山的手册说:
列表模式仅保持向后兼容。 为了更强大和可定制的输出使用findmnt(8),特别是在你的脚本。
所以正确的命令是findmnt
,它本身就是util-linux
包的一部分,根据手册:
可以在/ etc / fstab,/ etc / mtab或/ proc / self / mountinfo中search
所以它实际上search比mountpoint
更多的东西。 它也提供了方便的select:
-M, – 点path
明确定义安装点文件或目录。 另见–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 ab touch a/file ls b/ # should show file rm -fb/file ls a/ # should show nothing [[ $(findmnt -M b) ]] && echo "Mounted" sudo umount b [[ $(findmnt -M b) ]] || echo "Unmounted"
我的解决scheme
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的回答 ,如果在不同的文件系统中使用bind
选项进行装载, mountpoint
点将不起作用。
对于Christy Neylan的回答 ,不需要将grep的输出redirect到/ dev / null,而只需要使用grep -q
。
最重要的是,使用readlink -f $mypath
来规范path :
- 如果使用反斜杠检查
/path/to/dir/
end等path,/proc/mounts
或mount
输出中的/path/to/dir
为/path/to/dir
- 在大多数Linux发行版中,
/var/run/
是/var/run/
的符号链接,因此如果为/var/run/mypath
装入绑定并检查它是否挂载,它将显示为/proc/mounts
/run/mypath
。
在我的.bashrc中,我做了以下别名:
alias disk-list="sudo fdisk -l"