Unter Linux können Sie dies tun mit:
stdin_is_dev_null(){ test "`stat -Lc %t:%T /dev/stdin`" = "`stat -Lc %t:%T /dev/null`"; }
Auf einem Linux ohne stat(1) (zB die busybox auf Ihrem Router):
stdin_is_dev_null(){ ls -Ll /proc/self/fd/0 | grep -q ' 1, *3 '; }
Auf *bsd:
stdin_is_dev_null(){ test "`stat -f %Z`" = "`stat -Lf %Z /dev/null`"; }
Auf Systemen wie *bsd und solaris, /dev/stdin
, /dev/fd/0
und /proc/PID/fd/0
sind keine "magischen" Symlinks wie unter Linux, sondern Zeichengeräte, die beim Öffnen zur echten Datei wechseln . Ein stat(2) auf ihrem Pfad gibt etwas anderes zurück als ein fstat(2) auf dem geöffneten Dateideskriptor.
Das bedeutet, dass das Linux-Beispiel dort nicht funktioniert, selbst wenn GNU Coreutils installiert sind. Wenn die Version von GNU stat(1) aktuell genug ist, können Sie den -
verwenden Argument, um fstat(2) auf dem Dateideskriptor 0 auszuführen, genau wie stat(1) von *bsd:
stdin_is_dev_null(){ test "`stat -Lc %t:%T -`" = "`stat -Lc %t:%T /dev/null`"; }
Es ist auch sehr einfach, den Check portabel durchzuführen in jeder Sprache, die eine Schnittstelle zu fstat(2) bietet, zB. in perl
:
stdin_is_dev_null(){ perl -e 'exit((stat STDIN)[6]!=(stat "/dev/null")[6])'; }
Unter Linux, um festzustellen, ob die Standardeingabe von /dev/null
umgeleitet wird , können Sie überprüfen, ob /proc/self/fd/0
hat dasselbe Gerät und denselben Inode wie /dev/null
:
if [ /proc/self/fd/0 -ef /dev/null ]; then echo yes; else echo no; fi
Sie können /dev/stdin
verwenden statt /proc/self/fd/0
.
Wenn Sie überprüfen möchten, ob die Standardeingabe vom Nullgerät umgeleitet wird, müssen Sie die Major- und Minor-Gerätenummern vergleichen, zum Beispiel mit stat
(siehe auch mosvys Antwort):
if [ "$(stat -Lc %t:%T /dev/stdin)" = "$(stat -Lc %t:%T /dev/null)" ]; then echo yes; else echo no; fi
oder, wenn Sie sich nicht darum kümmern, dass dies Linux-spezifisch ist,
if [ "$(stat -Lc %t:%T /dev/stdin)" = "1:3" ]; then echo yes; else echo no; fi
Portabel, um zu überprüfen, ob stdin der null
ist Gerät (öffnen auf /dev/null
oder nicht (wie eine Kopie von /dev/null
)), mit zsh
(dessen stat
builtin ist älter als GNU und FreeBSD stat
übrigens (nicht IRIX'))):
zmodload zsh/stat
if [ "$(stat +rdev -f 0)" = "$(stat +rdev /dev/null)" ]; then
echo stdin is open on the null device
fi
(Beachten Sie, dass es nicht sagt, ob der Dateideskriptor im Nur-Lesen-, Nur-Schreiben- oder Lesen+Schreiben-Modus geöffnet war).
Um zu überprüfen, ob es auf dem aktuellen /dev/null
geöffnet ist Datei speziell (nicht /some/chroot/dev/null
zum Beispiel), nur unter Linux (wobei /dev/stdin
ist als symbolischer Link zu der auf fd 0 geöffneten Datei anstelle eines speziellen Geräts implementiert, das sich beim Öffnen wie ein dup(0)
verhält in anderen Systemen):
if [ /dev/stdin -ef /dev/null ]; then
echo stdin is open on /dev/null
fi
Unter Nicht-Linux können Sie Folgendes versuchen:
if sh -c 'lsof -tad0 -p"$$" /dev/null' > /dev/null 2>&-; then
echo stdin is open on /dev/null
fi