在bash中检查目录是否已挂载
1. 简介
在本文中,我们将讨论确定目录是否已挂载的不同方法。我们将使用命令mount 、mountpoint 和findmnt 并通过读取/proc/mounts 来这样做。
然后,我们还将在bash中制作一个小脚本。例如,我们将检查*/mnt/backup*是否已挂载,如果没有,我们将挂载它。
2. 使用 mount命令
我们可以确定目录是否已挂载的一种方法是运行 mount 命令并过滤输出。
它输出当前安装的文件系统列表,因此我们可以使用awk 搜索第 3 列中的目录:
$ mount | awk '{if ($3 == "/mnt/backup") { exit 0}} ENDFILE{exit -1}'
如果*/mnt/backup*是挂载点,上面的行将以 0(成功)退出。否则,它将返回 -1(错误)。
这种方法的缺点是当文件夹名称有空格时,这将无法正常工作。
让我们写一个例子来挂载*/mnt/backup*除非它已经挂载:
$ {
if mount | awk '{if ($3 == "/mnt/backup") { exit 0}} ENDFILE{exit -1}'; then
echo "/mnt/backup already mounted"
else
mount /dev/sdc1 /mnt/backup
fi
}
我们可以通过编写一个将要检查的路径作为参数的函数 来使其更具可移植性:
$ is_mounted() {
mount | awk -v DIR="$1" '{if ($3 == DIR) { exit 0}} ENDFILE{exit -1}'
}
现在我们可以使用该函数使if-else更清晰:
$ {
if is_mounted "/mnt/backup"; then
echo "/mnt/backup already mounted"
else
mount /dev/sdc1 /mnt/backup
fi
}
最后,如果我们只对一个结果感兴趣,我们可以写一行。让我们用 || 写一行 挂载目录(如果未挂载):
$ mount | awk '{if ($3 == "/mnt/backup") { exit 0}} ENDFILE{exit -1}' || mount /dev/sdc1 /mnt/backup
或者,如果我们只想在确实安装了目录时才运行任务,我们应该使用*&& :*
$ mount | awk '{if ($3 == "/mnt/backup") { exit 0}} ENDFILE{exit -1}' && echo "/mnt/backup already mounted"
3.使用 mountpoint命令
**我们还可以使用 mountpoint命令,它接受一个目录作为参数并打印它是否已挂载。**这样,我们就可以不用awk直接使用mountpoint了:
$ mountpoint /mnt/backup
让我们使用mountpoint重复上一节中的示例。它还接受参数*-q是安静的,所以我们不需要将输出重定向到/dev/null*:
$ {
if mountpoint -q /mnt/backup; then
echo "/mnt/backup already mounted"
else
mount /dev/sdc1 /mnt/backup
fi
}
代码很清楚,尽管我们可以参数化目录并编写一个函数,就像我们对mount所做的那样:
$ is_mounted() {
mountpoint -q "$1"
}
再一次,我们可以把它全部写在一行中。我们有两种选择——一种是在文件夹未挂载的情况下,另一种是:
$ mountpoint -q /mnt/backup || mount /dev/sdc1 /mnt/backup
$ mountpoint -q /mnt/backup && echo "/mnt/backup already mounted"
4. 使用 findmnt命令
另一种确定目录是否已挂载的方法是使用findmnt并将目录作为参数。
findmnt显示所有已安装文件系统的树。
但是,如果我们将目录作为参数提供给它,它只会打印有关该目录的信息:
$ findmnt /mnt/backup
让我们在if-else中使用**findmnt重复这个例子:
$ {
if findmnt /mnt/backup >/dev/null; then
echo "/mnt/backup already mounted"
else
mount /dev/sdc1 /mnt/backup
fi
}
我们还可以重写我们的*is_mounted()*函数:
$ is_mounted() {
findmnt "$1" >/dev/null
}
再一次,我们可以为这两种情况提供一个方便的单行代码:
$ findmnt /mnt/backup >/dev/null || mount /dev/sdc1 /mnt/backup
$ findmnt /mnt/backup >/dev/null && echo "/mnt/backup already mounted"
5. 读取*/proc/mounts*
*最后,如果我们过滤/proc/mounts文件的内容,**我们可以检查目录是否已挂载。该文件具有与mount和findmnt类似的信息,因此让我们使用awk*并搜索所需的目录:
$ awk '{if ($2 == "/mnt/backup") { exit 0}} ENDFILE{exit -1}' < /proc/mounts
现在,我们可以重做if-else示例:
$ {
if awk '{if ($2 == "/mnt/backup") { exit 0}} ENDFILE{exit -1}' < /proc/mounts; then
echo "/mnt/backup already mounted"
else
mount /dev/sdc1 /mnt/backup
fi
}
让我们通过在函数中编写条件来使代码更清晰:
$ is_mounted() {
awk -v DIR="$1" '{if ($2 == DIR) { exit 0}} ENDFILE{exit -1}' < /proc/mounts
}
最后,我们可以使用单行替代方案:
$ awk '{if ($2 == "/mnt/backup") { exit 0}} ENDFILE{exit -1}' < /proc/mounts || mount /dev/sdc1 /mnt/backup
$ awk '{if ($2 == "/mnt/backup") { exit 0}} ENDFILE{exit -1}' < /proc/mounts && echo "/mnt/backup already mounted"
如挂载示例中所述,当目录名称包含空格时,此方法将无法正常工作。