как лучше всего проверить, смонтирован ли том в скрипте bash?

<p>как лучше всего проверить, смонтирован ли том в скрипте bash?</p><p>что мне действительно нравится, так это метод, который я могу использовать так:</p><pre><code>if <something is mounted at /mnt/foo> then <do some stuff> else <do some different stuff> fi </code></pre>

<p>избегать использования <code>/etc/mtab</code> потому что это может быть противоречивым.</p><p>избегайте трубопровода <code>mount</code>, потому что это не должно быть таким сложным.</p><p>просто:</p><pre><code>if grep -qs '/mnt/foo ' /proc/mounts; then echo "it's mounted." else echo "it's not mounted." fi </code></pre><p>(пробел после <code>/mnt/foo</code>, чтобы избежать совпадения, например <code>/mnt/foo-bar</code>.)</p>

<pre><code>if mountpoint -q /mnt/foo then echo "mounted" else echo "not mounted" fi </code></pre><p>или</p><pre><code>mountpoint -q /mnt/foo && echo "mounted" || echo "not mounted" </code></pre>

<p><strong><code>findmnt -rno source,target "$1"</strong> избегает всех проблем в других ответах. это чисто делает работу с одной командой.<strong>другие подходы имеют эти недостатки:</strong> grep -q а также grep -s - это лишний ненужный шаг, который не поддерживается везде. /proc/ не поддерживается везде. mountinfo основан на/proc/.. cut -f3 -d' ' портит пробелы в именах путей парсинг <strong>mount</strong> пустое пространство проблематично. это страница руководства теперь говорит: <blockquote> .. режим листинга поддерживается только для обратной совместимости. для более надежного и настраиваемого вывода используйте <strong>findmnt</strong> (8), особенно в ваших скриптах. </blockquote><strong>функции bash:</strong>#these functions return exit codes: 0 = found, 1 = not found ismounted () { findmnt -rno source,target "$1" >/dev/null;} #path or device isdevmounted () { findmnt -rno source "$1" >/dev/null;} #device only ispathmounted() { findmnt -rno target "$1" >/dev/null;} #path only #where: -r = --raw, -n = --noheadings, -o = --output </code></pre><p><strong>примеры использования:</strong></p><pre><code>if ispathmounted "/mnt/foo bar"; #spaces in path names are ok. then echo "path is mounted" else echo "path is not mounted" fi if isdevmounted "/dev/sdb4"; then echo "device is mounted" else echo "device is not mounted" fi #universal: if ismounted "/mnt/foo bar"; then echo "device is mounted" else echo "device is not mounted" fi if ismounted "/dev/sdb4"; then echo "device is mounted" else echo "device is not mounted" fi </code></pre>

<p>такой сценарий никогда не будет переносимым. грязный секрет в unix заключается в том, что только ядро знает, где находятся файловые системы, и, за исключением таких вещей, как/proc (не переносимый), он никогда не даст вам прямого ответа.</p><p>обычно я использую df, чтобы узнать, что такое точка монтирования подкаталога и в какой файловой системе он находится.</p><p>например (требуется posix shell, такой как ash/at & t ksh/bash/etc)</p><pre><code>case $(df $mount) in $(df /)) echo $mount is not mounted ;; *) echo $mount has a non-root filesystem mounted on it ;; esac кинда рассказывает вам полезную информацию.

следующее - то, что я использую в одном из моих заданий cron резервного копирования rsync. он проверяет, смонтирован ли/backup, и пытается смонтировать его, если это не так (может произойти сбой, потому что диск находится в отсеке горячей замены и может даже не присутствовать в системе)примечание: следующее работает только на linux, потому что это greps/proc/mounts - более переносимая версия запускает 'mount | grep/backup ', как в ответе мэтью .. если ! grep -q/backup/proc/mounts; тогда если! монтирование/резервное копирование; затем эхо "не удалось" выход 1 fi fi эхо "успешно". # делать вещи здесь 

поскольку для монтирования вам все равно нужен каталог, который монтируется, моя стратегия всегда заключалась в том, чтобы создать поддельный файл со странным именем, которое никогда не будет использоваться, и просто проверить его существование. если файл был там, то на этом месте ничего не было смонтировано ...я не думаю, что это работает для монтажа сетевых дисков или подобных вещей. я использовал его для флешек.

как насчет сравнения номеров устройств? я просто пытался придумать самый эзотерический путь ..#!/bin/bash if [[ $(stat -c "%d" /mnt) -ne $(stat -c "%d" /mnt/foo) ]]; then echo "somethin mounted there i reckon" fi в моей логике есть недостаток ...как функция:#!/usr/bin/bash function somethingmounted { mountpoint="$1" if ! device1=$(stat -c "%d" $mountpoint); then echo "error on stat of mount point, maybe file doesn't exist?" 1>&2 return 1 fi if ! device2=$(stat -c "%d" $mountpoint/..); then echo "error on stat one level up from mount point, maybe file doesn't exist?" 1>&2 return 1 fi if [[ $device1 -ne $device2 ]]; then #echo "somethin mounted there i reckon" return 0 else #echo "nothin mounted it seems" return 1 fi } if somethingmounted /tmp; then echo "yup" fi </code></pre><p>эхо-сообщения об ошибках, вероятно, являются избыточными, потому что stat будет отображать и ошибку.</p>

<p>извините, что поднял это, но я думаю, что это довольно полезно:</p><pre><code>if awk '{print $2}' /proc/mounts | grep -qs "^/backup$"; then echo "it's mounted." else echo "it's not mounted." fi </code></pre><p>это получает 2-й столбец/proc/mounts (2-й столбец = точки монтирования).</p><p>затем он получает вывод. обратите внимание на ^ и $, это предотвращает совпадение/backup/mnt/backup или/backup-old и т.д.

ни один из них не удовлетворяет случаю использования, где данный каталог является подкаталогом в другой точке монтирования. например, у вас может быть/вещь, которая является монтированием nfs к хосту:/real_thing. использование grep для этой цели в/proc/mounts/etc/mtab или 'mount' не будет работать, потому что вы будете искать точку монтирования, которая не существует. например,/thing/thingy не является точкой монтирования, но/thing монтируется на хосте:/real_thing. лучший ответ, за который проголосовали здесь, на самом деле не "лучший способ определить, смонтирован ли каталог/volumne". я бы проголосовал за использование "df -p" (режим стандартов -p posix) в качестве более чистой стратегии:dev=df -p /thing/thingy | awk 'begin {e=1} $nf ~ /^\/.+/ { e=0 ; print $1 ; exit } end { exit e }' && { echo "mounted via: $dev" } || { echo "not mounted" } </code></pre><p>результат выполнения этого будет:</p><pre><code>mounted via: host:/real\_thing </code></pre><p>если вы хотите знать, какова реальная точка монтирования, не проблема:</p><pre><code>mp=`df -p /thing/thingy | awk 'begin {e=1} $nf ~ /^/.+/ { e=0 ; print $nf ; exit } end { exit e }'` && { echo "mounted on: $mp" } || { echo "not mounted" } результатом этой команды будет:mounted on: /thing все это очень полезно, если вы пытаетесь создать какой-либо chroot, который отражает точки монтирования вне chroot, внутри chroot, через какой-либо произвольный каталог или список файлов.

зависит от того, что вы знаете о том, что вы проверяете.в конкретном случае, который я недавно исследовал, когда меня интересовало, был ли установлен конкретный флеш-накопитель, что проще всего проверить на наличие/dev/disc/by-label /. если устройство подключено, сценарии udev удостоверяются, что ссылка существует (и что она удаляется при отключении устройства).(это не очень переносимый ответ; он работает во многих современных дистрибутивах linux, однако, вопрос был помечен для linux, и это совершенно иной подход, чем все упомянутые, поэтому он расширяет возможности.)

мне нравятся ответы, которые используют /proc/mounts, но мне не нравится делать простой grep. это может дать вам ложные срабатывания. то, что вы <strong>на самом деле</strong> хотите знать, это "иметь ли у какой-либо строки эту точную строку для поля номер 2". итак, задайте этот вопрос. (в этом случае я проверяю /opt)<pre class="lang-sh prettyprint-override">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 

хотя это вопрос linux, почему бы не сделать его переносимым, когда это легко сделать?страница руководства grep гласит:<blockquote> скрипты portable shell должны избегать как -q, так и -s и перенаправлять стандартный вывод и вывод ошибок на /dev/null вместо. </blockquote>поэтому я предлагаю следующее решение:if grep /mnt/foo /proc/mounts > /dev/null 2>&1; then echo "mounted" else echo "not mounted" fi 

grep/etc/mtab для вашей точки монтирования может быть?

должно ли это быть более сложным, чем это?mount  | cut -f 3 -d ' '  | grep -q /mnt/foo  && echo "mounted" || echo "not mounted" 

эта?:volume="/media/storage" if mount|grep $volume; then echo "mounted" else echo "not mounted" if </code></pre><p>от: <a href="http://ubuntuforums.org/showthread.php?t=436818">форум ubunt</a> </p>

<p>создайте файл под точкой монтирования, например <code>check\_mount</code> а затем просто проверить, существует ли он?</p><pre><code>if [[ -f /something/check\_mount ]]; then echo "mounted rc=$? else echo "not mounted" rc=0 fi exit $rc </code></pre>