Gelegentlich muss ich einen „Pfad-Äquivalent“ von einem der Standard - IO - Streams , um anzugeben ( stdin
, stdout
, stderr
). Da 99% der Zeit , die ich mit Linux arbeiten, ich voranstellen , nur /dev/
zu bekommen /dev/stdin
, usw., und diese „ scheint das Richtige zu tun“. Aber zum einen war ich mir über eine solche Begründung immer unwohl (weil "es anscheinend funktioniert", bis es nicht funktioniert). Außerdem habe ich keinen guten Sinn dafür, wie tragbar dieses Manöver ist.
Ich habe also ein paar Fragen:
Im Rahmen von Linux, ist es sicher (ja / nein) zu
stdin
,stdout
undstderr
mit/dev/stdin
,/dev/stdout
und/dev/stderr
?Ist diese Äquivalenz im Allgemeinen "angemessen tragbar "?
Ich konnte keine POSIX-Referenzen finden.
Antworten:
Es war unter Linux schon in der Vorgeschichte verfügbar. Es ist kein POSIX, obwohl es von vielen tatsächlichen Shells (einschließlich AT & T
ksh
undbash
) simuliert wird, wenn es im Betriebssystem nicht vorhanden ist. Beachten Sie, dass diese Simulation nur auf der Shell-Ebene funktioniert (dh Umleitung oder Befehlszeilenparameter, nicht als explizites Argument für zopen()
. B. ). Das heißt, es sollte auf den meisten kommerziellen Unix-Systemen auf die eine oder andere Weise verfügbar sein (manchmal wird es/dev/fd/N
für verschiedene Ganzzahlen geschriebenN
, aber die meisten Systeme mit solchen Symbolen bieten Symlinks wie Linux und * BSD).quelle
/dev/std{in,out,err}
sind sie ausdrücklich nicht als Teil des POSIX.1-2008- Standards aufgeführt.ash
nicht unterstützt/dev/stdout
Die
/dev/std{in,out,err}
Dateien sind normalerweise nur Symlinks zu/proc/self/fd/{0,1,2}
(bzw.). Als solche gibt es nichts, was über die Verwendung von Methoden, die POSIX-definiert sind, gewonnen wurde.Wenn Sie POSIX-konform sein möchten, verwenden Sie am besten die Ausgabeumleitung. Die Shell-Ausgabeumleitung ist im POSIX-Standard definiert . Zusätzlich sind die Dateideskriptornummern STDIN, STDOUT und STDERR Bestandteil von POSIX .
Kurz gesagt, Dinge wie
>&2
funktionieren garantiert.Wichtig ist jedoch, dass die Verwendung von STDIN, STDOUT und STDERR sich subjektiv auf den Programmstart auswirkt. Wenn das Programm mit Dateideskriptor 1 als offenem Handle für eine Datei gestartet wurde, muss es von Ihrem Programm nur akzeptiert werden. Selbst wenn Sie das Programm öffnen würden
/dev/stdout
, würde es nur den Dateideskriptor 1 öffnen, der immer noch auf diese Datei verweist.Wenn Sie dies versuchen, müssen Sie das TTY direkt öffnen. Normalerweise sind STDIN, STDOUT und STDERR ohne Umleitung nur offene Dateideskriptoren, die auf dasselbe TTY verweisen. Es gibt absolut nichts mehr als das.
quelle
/proc/self/fd/1
oder ob Sie/dev/fd/1
Teil von POSIX sind?/dev/std???
sind nur symlinks zu/proc/self/fd
unter Linux.POSIX 7 gibt an, dass es sich um Erweiterungen handelt.
Basisdefinitionen , Abschnitt 2.1.1 Anforderungen:
Gefunden durch Aufrufen des POSIX-HTML: Wo befindet sich die Liste der POSIX-C-API-Funktionen?
Auch ziemlich seltsam, gibt das
uuencode
Werkzeug einen magischen Effekt :/dev/stdout
Die Linux-Kernel-Dokumentation besagt, dass alle Systeme sie haben sollten.
https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/devices.rst
Ich konnte jedoch nicht finden, wo diese Symlinks im Kernel erstellt werden (Distribution bereitgestellt?).
quelle
/ dev / {stdout, stdin, stderr} arbeiten in Bash auf diesen Plattformen:
Scheitert aber in csh an diesen:
quelle
bash
ist etwas Besonderes, da es kompiliert werden kann, um/dev/fd/x
für Umleitungen auf Systemen, die nicht über/dev/fd
Ein Problem mit
/dev/stdout
und mit Freunden ist, dass Sie unter bestimmten Umständen möglicherweise nicht berechtigt sind, an sie zu schreiben. Ich habe dies zum Beispiel beim Aufrufen von Skripten aus Nix festgestellt und mir ähnliche Tools vorgestellt, mit denen Skripten in Jails / Sandboxes / Containern / VMs / etc ausgeführt werden. kann auf ähnliche Probleme stoßen.Mit Syntax wie
1>&2
in diesen Fällen gearbeitet und, da ich wusste , dass ich in Bash laufen würde, könnte ich mit Prozess - Substitution für Befehle , die Dateinamen erwarten.quelle