GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie überprüfe ich von der Shell aus, ob stdin /dev/null ist?

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

Linux
  1. Linux:Unterschied zwischen /dev/console , /dev/tty und /dev/tty0?

  2. Wie erkennt man, ob die Shell von ssh aus gesteuert wird?

  3. Linux – Wie erstellt man /dev/null?

  4. So ordnen Sie /dev/sdX- und /dev/mapper/mpathY-Geräte vom /dev/dm-Z-Gerät zu

  5. Wie kann /dev/random oder /dev/urandom mit base64 codiert werden?

So leiten Sie die Ausgabe unter Linux nach /dev/null um

Wie portabel sind /dev/stdin, /dev/stdout und /dev/stderr?

Wie man einen Cronjob komplett zum Schweigen bringt /dev/null/?

So überprüfen Sie, ob ein Shell-Befehl von PHP existiert

Wie erstellt man /dev/null?

Linux:Unterschied zwischen /dev/console , /dev/tty und /dev/tty0