Gibt es unter Linux eine Möglichkeit für ein Shell-Skript zu überprüfen, ob seine Standardeingabe vom Nullgerät (1, 3) * umgeleitet wird , idealerweise ohne etwas zu lesen?
Das erwartete Verhalten wäre:
./checkstdinnull
-> no
./checkstdinnull < /dev/null
-> yes
echo -n | ./checkstdinnull
-> no
EDIT
mknod secretunknownname c 1 3
exec 6<secretunknownname
rm secretunknownname
./checkstdinnull <&6
-> yes
Ich vermute , dass ich „nur“ Notwendigkeit , die maj / min Anzahl der Eingabe lesen Geräts . Aber ich kann keinen Weg finden, dies aus der Shell heraus zu tun.
* Nicht nur notwendig
/dev/null
, sondern jedes Nullgerät, auch wenn es manuell mit erstellt wurde mknod
.
/dev/null
oder nur, dass es kein tty ist?{ readlink -f /dev/stdin; } <&6
für den Fall, in dem Sie exec verwendet und den Knoten entfernt haben, ist/root/secretunknownname (deleted)
. Wie es zeigt, wurde die Datei gelöscht: Reicht das nicht für das, was Sie brauchen?stat
funktioniert nur die Lösung./dev/null
, aber nicht notwendig. Sie können "Alias" mitmknod
s in meinem Beispiel dargestellt.Antworten:
Unter Linux können Sie dies tun mit:
Unter Linux ohne stat (1) (z. B. die Busybox auf Ihrem Router):
On * bsd:
Auf Systemen wie * bsd und solaris,
/dev/stdin
,/dev/fd/0
und/proc/PID/fd/0
sind nicht „magische“ Symlinks als auf Linux, aber Zeichengeräte , die auf die reale Datei wechseln wird , wenn sie geöffnet . Ein stat (2) auf ihrem Pfad gibt etwas anderes zurück als ein fstat (2) im geöffneten Dateideskriptor.Dies bedeutet, dass das Linux-Beispiel dort nicht funktioniert, selbst wenn GNU-Coreutils installiert sind. Wenn die Versionen von GNU stat (1) aktuell genug sind, können Sie das
-
Argument verwenden, um ein fstat (2) für den Dateideskriptor 0 auszuführen, genau wie stat (1) von * bsd:Es ist auch sehr einfach, die Prüfung portabel in jeder Sprache durchzuführen, die eine Schnittstelle zu fstat (2) bietet, z. in
perl
:quelle
/dev/null
ist1:3
, können Sie dies sofort testen.stat
wäre ich schon ziemlich zufrieden gewesen , wenn die Antwort mich nur auf den Befehl hingewiesen hätte. Ich sehe keinen Sinn darin, einen Schnittkrieg zwischen`
und$(
Unterstützern zu beginnen. Persönlich bevorzuge ich$(...)
und es gibt einige POSIX- Gründe für diese Syntax ( pubs.opengroup.org/onlinepubs/9699919799/xrat/… ). Aber ich sehe keinen Sinn darin, eine ansonsten korrekte Antwort für etwas herunterzustimmen, das nicht mit dem zusammenhängt Frage.$( ... )
im Zusammenhang mit dieser Antwort Backticks vorgezogen werden?$(..)
Stil verschachtelt leichter und AIUI ist der bevorzugte Ansatz von POSIX. Ich hatte sicherlich nicht vorgehabt, irgendeine Form von Bearbeitungskrieg zu beginnen, sondern lieber mit einem Vorschlag zu kommentieren, als Ihre ausgezeichnete Antwort zu ändern.Um festzustellen, ob unter Linux die Standardeingabe umgeleitet wird
/dev/null
, können Sie überprüfen, ob/proc/self/fd/0
dasselbe Gerät und derselbe Inode vorhanden sind wie/dev/null
:Sie können
/dev/stdin
anstelle von verwenden/proc/self/fd/0
.Wenn Sie überprüfen möchten, ob die Standardeingabe vom Nullgerät umgeleitet wird, müssen Sie die Haupt- und Nebengerätenummern vergleichen, z. B. mit
stat
(siehe auch die Antwort von mosvy ):oder, wenn Sie sich nicht dafür interessieren, dass dies Linux-spezifisch ist ,
quelle
bash -c 'ls -l /proc/self/fd/0 /dev/null; [[ /proc/self/fd/0 -ef /dev/null ]] && echo dev null'
dann mach das nochmal mit</dev/null
. +1/dev/stdin
Symlink zur Originaldatei ist spezifisch für Linux, daher sind alle diese Lösungen sowieso Linux-spezifisch. Diestat
basierten erfordern GNU oder Busyboxstat
. Mit neueren Versionen von GNUstat
können Siestat -
einfstat()
on fd 0 ausführen, das dann auf Nicht-Linux-Systemen funktioniert./dev/null
und dem Null-Gerät unterschieden wurde.Um zu überprüfen, ob stdin das
null
Gerät ist (geöffnet auf/dev/null
oder nicht (wie eine Kopie von/dev/null
)), mitzsh
(dessenstat
eingebautes Gerät übrigens vor GNU und FreeBSD liegtstat
(allerdings nicht vor IRIX)):(Beachten Sie, dass nicht angegeben wird, ob der Dateideskriptor im Nur-Lese-, Nur-Schreib- oder Lese- / Schreibmodus geöffnet war.)
Um zu überprüfen, ob es in der aktuellen
/dev/null
Datei speziell (nicht/some/chroot/dev/null
zum Beispiel) geöffnet ist , nur unter Linux (wobei/dev/stdin
es als Symlink zu der auf fd 0 geöffneten Datei anstelle eines speziellen Geräts implementiert ist, das sich beim Öffnen wiedup(0)
in anderen Systemen verhält):Unter Nicht-Linux können Sie Folgendes versuchen:
quelle