Как проверить, является ли данный путь точкой монтирования

Предположим, вы хотите проверить, является ли /mnt/disk точкой монтирования в оболочке script. Как вы это делаете?

Ответ 1

Я обнаружил, что на моей Fedora 7 есть команда mountpoint.

От точки монтирования человека:

NAME
       mountpoint - see if a directory is a mountpoint

SYNOPSIS
       /bin/mountpoint [-q] [-d] /path/to/directory
       /bin/mountpoint -x /dev/device

По-видимому, он поставляется с пакетом sysvinit, я не знаю, доступна ли эта команда в других системах.

[[email protected]~]# rpm -qf $(which mountpoint)
sysvinit-2.86-17

Ответ 2

Не полагаясь на mount, /etc/mtab, /proc/mounts и т.д.:

if [ `stat -fc%t:%T "$dir"` != `stat -fc%t:%T "$dir/.."` ]; then
    echo "$dir is mounted"
else
    echo "$dir is not mounted"
fi

Когда $dir является точкой монтирования, у нее есть другой номер устройства, чем его родительский каталог.

Преимущество по сравнению с перечисленными альтернативами заключается в том, что вам не нужно ничего разбирать, и он делает правильные вещи, если dir=/some//path/../with///extra/components.

Недостатком является то, что он не указывает / как точку монтирования. Ну, это достаточно легко для особого случая, но все же.

Ответ 3

Использование GNU find

find <directory> -maxdepth 0 -printf "%D" 

укажет номер устройства в каталоге. Если он отличается каталог и его родительский элемент, то у вас есть точка монтирования.

Добавить/. на имя каталога, если вы хотите, чтобы символические ссылки в разные файловые системы считать как точки монтирования (вы всегда будете хотеть его для родителя).

Недостатки: использование GNU менее портативно

Преимущества: точки монтирования отчетов не записываются в/etc/mtab.

Ответ 4

if mount | cut -d ' ' -f 3 | grep '^/mnt/disk$' > /dev/null ; then
   ...
fi

EDIT: Использовать идею Bombe для использования разреза.

Ответ 5

df $path_in_question | grep " $path_in_question$"

После завершения будет установлено $?.

Ответ 6

К сожалению, как mountpoint, так и stat будут иметь побочный эффект МОНТИРОВАНИЯ каталога, который вы тестируете, если вы используете automount. Или, по крайней мере, это для меня на Debian, используя автоматические cifs для сетевого диска WD MyBookLive. Я закончил с вариантом /proc/mounts, сделанным более сложным, потому что каждый POTENTIAL mount уже находится в /proc/mount, даже если он не монтируется на самом деле!

cut -d ' ' -f 1 < /proc/mounts | grep -q '^//disk/Public$' && umount /tmp/cifs/disk/Public
Where
   'disk' is the name of the server (networked disk) in /etc/hosts.
   '//disk/Public' is the cifs share name
   '/tmp/cifs' is where my automounts go (I have /tmp as RAM disk and / is read-only)
   '/tmp/cifs/disk' is a normal directory created when the server (called 'disk') is live.
   '/tmp/cifs/disk/Public' is the mount point for my 'Public' share.

Ответ 7

for mountedPath in `mount | cut -d ' ' -f 3`; do
    if [ "${mountedPath}" == "${wantedPath}" ]; then
        exit 0
    fi
done
exit 1

Ответ 8

Вот вариант с "df -P", который должен быть переносимым:

[email protected]:/tmp$ f(){ df -P  | awk '{ if($6 == "'$1'")print   }' ; }
[email protected]:/tmp$ f /
/dev/mapper/lvm0-vol1  20642428  17141492   2452360      88% /
[email protected]:/tmp$ f /mnt
[email protected]:/tmp$ f /mnt/media
/dev/mapper/lvm0-media  41954040  34509868   7444172      83% /mnt/media

Ответ 9

mount | awk '$3 == "/pa/th" {print $1}'

Пусто, если не является точкой монтирования ^^