GNU/Linux >> Znalost Linux >  >> Linux

Jak zkontrolovat, zda je stdin /dev/null z shellu?

V linuxu to můžete udělat pomocí:

stdin_is_dev_null(){ test "`stat -Lc %t:%T /dev/stdin`" = "`stat -Lc %t:%T /dev/null`"; }

Na linuxu bez stat(1) (např. busybox na vašem routeru):

stdin_is_dev_null(){ ls -Ll /proc/self/fd/0 | grep -q ' 1,  *3 '; }

Na *bsd:

stdin_is_dev_null(){ test "`stat -f %Z`" = "`stat -Lf %Z /dev/null`"; }

Na systémech jako *bsd a Solaris, /dev/stdin , /dev/fd/0 a /proc/PID/fd/0 nejsou "magické" symbolické odkazy jako na linuxu, ale znaková zařízení, která se při otevření přepnou na skutečný soubor . Stat(2) na jejich cestě vrátí něco jiného než fstat(2) na otevřeném deskriptoru souboru.

To znamená, že linuxový příklad tam nebude fungovat ani s nainstalovaným GNU coreutils. Pokud jsou verze GNU stat(1) dostatečně aktuální, můžete použít - argument, který mu umožní provést fstat(2) na deskriptoru souboru 0, stejně jako stat(1) z *bsd:

stdin_is_dev_null(){ test "`stat -Lc %t:%T -`" = "`stat -Lc %t:%T /dev/null`"; }

Je také velmi snadné provést kontrolu přenosně v jakémkoli jazyce, který nabízí rozhraní pro fstat(2), např. v perl :

stdin_is_dev_null(){ perl -e 'exit((stat STDIN)[6]!=(stat "/dev/null")[6])'; }

V systému Linux k určení, zda je standardní vstup přesměrován z /dev/null , můžete zkontrolovat, zda /proc/self/fd/0 má stejné zařízení a inode jako /dev/null :

if [ /proc/self/fd/0 -ef /dev/null ]; then echo yes; else echo no; fi

Můžete použít /dev/stdin místo /proc/self/fd/0 .

Pokud chcete zkontrolovat, zda je standardní vstup přesměrován z nulového zařízení, musíte porovnat hlavní a vedlejší čísla zařízení, například pomocí stat (viz také mosvyho odpověď):

if [ "$(stat -Lc %t:%T /dev/stdin)" = "$(stat -Lc %t:%T /dev/null)" ]; then echo yes; else echo no; fi

nebo, pokud vám nezáleží na tom, že je to specifické pro Linux,

if [ "$(stat -Lc %t:%T /dev/stdin)" = "1:3" ]; then echo yes; else echo no; fi

Přenosně, abyste zkontrolovali, že stdin je null zařízení (otevřeno na /dev/null nebo ne (jako kopie /dev/null )), s zsh (jehož stat vestavěný předchází GNU i FreeBSD stat mimochodem (i když ne IRIX'))):

zmodload zsh/stat
if [ "$(stat +rdev -f 0)" = "$(stat +rdev /dev/null)" ]; then
  echo stdin is open on the null device
fi

(všimněte si, že neříká, zda byl deskriptor souboru otevřen v režimu jen pro čtení, pouze pro zápis nebo pro čtení+zápis).

Chcete-li zkontrolovat, zda je otevřen na aktuálním /dev/null konkrétně soubor (nikoli /some/chroot/dev/null například), pouze na Linuxu (kde /dev/stdin je implementován jako symbolický odkaz na soubor otevřený na fd 0 namísto speciálního zařízení, které se při otevření chová jako dup(0) v jiných systémech):

if [ /dev/stdin -ef /dev/null ]; then
  echo stdin is open on /dev/null
fi

V jiném systému než Linux můžete zkusit:

if sh -c 'lsof -tad0 -p"$$" /dev/null' > /dev/null 2>&-; then
  echo stdin is open on /dev/null
fi

Linux
  1. Jak Linux zpracovává více po sobě jdoucích oddělovačů cest (/home////username///soubor)?

  2. Linux – Jak vytvořit /dev/null?

  3. Jak namapovat zařízení /dev/sdX a /dev/mapper/mpathY ze zařízení /dev/dm-Z

  1. Jak kódovat base64 /dev/random nebo /dev/urandom?

  2. Jak zkontrolovat, zda existuje příkaz shellu z PHP

  3. obrazovka Nelze otevřít váš terminál '/dev/pts/0' - zkontrolujte prosím

  1. Jak spustit příkaz Vim z shellu?

  2. DD z /dev/zero do /dev/null...co se vlastně stane

  3. Jak vytvořit /dev/null?