Contents

在bash中检查目录是否已挂载

1. 简介

在本文中,我们将讨论确定目录是否已挂载的不同方法。我们将使用命令mountmountpointfindmnt 并通过读取/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文件的内容,**我们可以检查目录是否已挂载。该文件具有与mountfindmnt类似的信息,因此让我们使用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"

如挂载示例中所述,当目录名称包含空格时,此方法将无法正常工作。