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