Soluzione 1:
Evita di usare /etc/mtab
perché potrebbe essere incoerente.
Evita il piping mount
perché non deve essere così complicato.
Semplicemente:
if grep -qs '/mnt/foo ' /proc/mounts; then
echo "It's mounted."
else
echo "It's not mounted."
fi
(Lo spazio dopo il /mnt/foo
è evitare la corrispondenza, ad es. /mnt/foo-bar
.)
Soluzione 2:
if mountpoint -q /mnt/foo
then
echo "mounted"
else
echo "not mounted"
fi
o
mountpoint -q /mnt/foo && echo "mounted" || echo "not mounted"
Soluzione 3:
findmnt -rno SOURCE,TARGET "$1"
evita tutti i problemi nelle altre risposte. Fa il lavoro in modo pulito con un solo comando.
Altri approcci hanno questi aspetti negativi:
grep -q
egrep -s
sono un passaggio extra non necessario e non sono supportati ovunque./proc/\*
non è supportato ovunque. (mountpoint
si basa anche su proc).mountinfo
è basato su /proc/..cut -f3 -d' '
incasina gli spazi nei nomi dei percorsi- Analisi di mount lo spazio bianco di è problematico. La sua pagina man ora dice:
.. la modalità elenco viene mantenuta solo per compatibilità con le versioni precedenti.
Per un output più solido e personalizzabile usa findmnt (8), specialmente nei tuoi script.
Funzioni Bash:
#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
Esempi di utilizzo:
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
Soluzione 4:
Uno script come questo non sarà mai portatile. Uno sporco segreto in unix è che solo il kernel sa dove si trovano i filesystem e, a parte cose come /proc (non portabile), non ti darà mai una risposta diretta.
Di solito uso df per scoprire qual è il punto di montaggio di una sottodirectory e in quale filesystem si trova.
Ad esempio (richiede shell posix come ash / AT&T ksh / bash / etc)
case $(df $mount)
in
$(df /)) echo $mount is not mounted ;;
*) echo $mount has a non-root filesystem mounted on it ;;
esac
Kinda ti dice informazioni utili.
Soluzione 5:
quanto segue è quello che uso in uno dei miei cron-job di backup di rsync. controlla se /backup è montato e prova a montarlo se non lo è (potrebbe fallire perché l'unità si trova in un alloggiamento hot-swap e potrebbe anche non essere presente nel sistema)
NOTA:quanto segue funziona solo su Linux, perché greps /proc/mounts - una versione più portabile eseguirà 'mount | grep /backup', come nella risposta di Matthew..
if ! grep -q /backup /proc/mounts ; then if ! mount /backup ; then echo "failed" exit 1 fi fi echo "suceeded." # do stuff here