GNU/Linux >> Znalost Linux >  >> Linux

Jaký je nejlepší způsob, jak zkontrolovat, zda je svazek připojen ve skriptu Bash?

Řešení 1:

Nepoužívejte /etc/mtab protože to může být nekonzistentní.

Vyhněte se potrubí mount protože to nemusí být tak složité.

Jednoduše:

if grep -qs '/mnt/foo ' /proc/mounts; then
    echo "It's mounted."
else
    echo "It's not mounted."
fi

(Mezera za /mnt/foo je vyhnout se shodě např. /mnt/foo-bar .)

Řešení 2:

if mountpoint -q /mnt/foo 
then
   echo "mounted"
else
   echo "not mounted"
fi

nebo

mountpoint -q /mnt/foo && echo "mounted" || echo "not mounted"

Řešení 3:

findmnt -rno SOURCE,TARGET "$1" vyhýbá se všem problémům v ostatních odpovědích. Úlohu provede čistě pomocí jediného příkazu.

Jiné přístupy mají tyto nevýhody:

  • grep -q a grep -s jsou zbytečným krokem navíc a nejsou podporovány všude.
  • /proc/\* není všude podporováno. (mountpoint je také založen na proc).
  • mountinfo je založen na /proc/..
  • cut -f3 -d' ' kazí mezery v názvech cest
  • Analýza připojit bílé místo je problematické. Manuálová stránka nyní říká:

.. režim výpisu je zachován pouze pro zpětnou kompatibilitu.

Pro robustnější a přizpůsobitelný výstup použijte findmnt (8), zejména ve vašich skriptech.

Funkce 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

Příklady použití:

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

Řešení 4:

Skript jako tento nikdy nebude přenosný. Špinavé tajemství v unixu je, že pouze jádro ví, kde kde jsou souborové systémy, a kromě věcí jako /proc (nepřenosné) vám nikdy nedá přímou odpověď.

Obvykle používám df ke zjištění, jaký je bod připojení podadresáře a v jakém souborovém systému se nachází.

Například (vyžaduje posix shell jako ash / AT&T ksh / bash / atd.)

case $(df  $mount)
in
  $(df  /)) echo $mount is not mounted ;;
  *) echo $mount has a non-root filesystem mounted on it ;;
esac

Něco vám řekne užitečné informace.

Řešení 5:

následující je to, co používám v jednom z mých zálohovacích cron úloh rsync. zkontroluje, zda je připojen /backup, a pokusí se jej připojit, pokud není (může selhat, protože disk je v pozici vyměnitelné za běhu a nemusí být ani přítomen v systému)

POZNÁMKA:následující funguje pouze na linuxu, protože greps /proc/mounts - přenosnější verze by spouštěla ​​'mount | grep /backup', jako v Matthewově odpovědi..

  if ! grep -q /backup /proc/mounts ; then
    if ! mount /backup ; then
      echo "failed"
      exit 1
    fi
  fi
  echo "suceeded."
  # do stuff here

Linux
  1. Jaký je nejlepší způsob, jak vyslat signál všem členům procesní skupiny?

  2. Jaký je nejlepší způsob, jak zajistit, aby byla spuštěna pouze jedna instance skriptu Bash?

  3. Jakýkoli způsob, jak ukončit bash skript, ale ne opustit terminál

  1. Bash Shell Script - Zkontrolujte, zda nemáte příznak a zjistěte jeho hodnotu

  2. Variabilní rozsah pro skripty bash shell a funkce ve skriptu

  3. Jaký je rozdíl mezi prováděním skriptu Bash a jeho získáváním?

  1. Zkontrolujte, zda některý z parametrů bash skriptu odpovídá řetězci

  2. Jaký je nejlepší způsob, jak znovu spojit soubory po jejich rozdělení?

  3. Jaký je nejlepší způsob, jak se naučit SELinux?