Lösung 1:
Vermeiden Sie die Verwendung von /etc/mtab
weil es möglicherweise inkonsistent ist.
Vermeiden Sie die Verrohrung von mount
weil es gar nicht so kompliziert sein muss.
Einfach:
if grep -qs '/mnt/foo ' /proc/mounts; then
echo "It's mounted."
else
echo "It's not mounted."
fi
(Das Leerzeichen nach /mnt/foo
ist es, Übereinstimmungen zu vermeiden, z. /mnt/foo-bar
.)
Lösung 2:
if mountpoint -q /mnt/foo
then
echo "mounted"
else
echo "not mounted"
fi
oder
mountpoint -q /mnt/foo && echo "mounted" || echo "not mounted"
Lösung 3:
findmnt -rno SOURCE,TARGET "$1"
vermeidet alle Probleme in den anderen Antworten. Es erledigt die Arbeit sauber mit nur einem Befehl.
Andere Ansätze haben diese Nachteile:
grep -q
undgrep -s
sind ein unnötiger zusätzlicher Schritt und werden nicht überall unterstützt./proc/\*
wird nicht überall unterstützt. (mountpoint
basiert ebenfalls auf proc).mountinfo
basiert auf /proc/..cut -f3 -d' '
bringt Leerzeichen in Pfadnamen durcheinander- Parsen von Mount Der Leerraum von ist problematisch. Die Manpage sagt jetzt:
.. Der Auflistungsmodus wird nur aus Gründen der Abwärtskompatibilität beibehalten.
Verwenden Sie für eine robustere und anpassbare Ausgabe findmnt (8), insbesondere in Ihren Skripten.
Bash-Funktionen:
#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
Verwendungsbeispiele:
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
Lösung 4:
Ein Skript wie dieses wird niemals portierbar sein. Ein schmutziges Geheimnis in Unix ist, dass nur der Kernel weiß, welche Dateisysteme wo sind, und abgesehen von Dingen wie /proc (nicht portierbar) wird er Ihnen niemals eine klare Antwort geben.
Normalerweise verwende ich df, um herauszufinden, was der Einhängepunkt eines Unterverzeichnisses ist und in welchem Dateisystem es sich befindet.
Zum Beispiel (erfordert Posix-Shell wie 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 sagt Ihnen nützliche Informationen.
Lösung 5:
Folgendes verwende ich in einem meiner rsync-Backup-Cron-Jobs. es prüft, ob /backup gemountet ist, und versucht, es zu mounten, wenn dies nicht der Fall ist (es kann fehlschlagen, weil sich das Laufwerk in einem Hot-Swap-Schacht befindet und möglicherweise nicht einmal im System vorhanden ist)
HINWEIS:Folgendes funktioniert nur unter Linux, da es greps /proc/mounts - eine portablere Version würde 'mount | grep /backup', wie in Matthews Antwort..
if ! grep -q /backup /proc/mounts ; then if ! mount /backup ; then echo "failed" exit 1 fi fi echo "suceeded." # do stuff here