In Skripten werden Fehler normalerweise an den Dateideskriptor 2 gesendet &2
, dh:
echo "error" >&2
Manchmal /dev/stderr
wird stattdessen verwendet:
echo "error" > /dev/stderr
Beim Betrachten /dev/stderr
sehe ich, dass es sich nur um einen Symlink zu handelt /proc/self/fd/2
, der wiederum ein Symlink zu /dev/pts/5
(auf meinem aktuellen Terminal) ist.
Scheint etwas zu kompliziert. Gibt es eine Logik dahinter?
Ist die Verwendung /dev/stderr
und &2
gleichwertig?
Ist einer von denen dem anderen vorzuziehen?
portability
stderr
Martin Vegter
quelle
quelle
echo "error" >2
Erstellt eine Datei mit Name2
und Inhalterror
.>2
, oder>&2
?Antworten:
Das spezielle Gerät
/dev/stderr
ist systemspezifisch, während der Dateideskriptor2
(nicht das spezielle Gerät/proc/self/fd/2
) portabel ist. Wenn Sie nicht portablen Code schreiben möchten, sind diese speziellen Geräte ein guter Ausgangspunkt.Es gibt einige Systeme mit
/dev/stderr
: natürlich Linux und OSX . Aber OSX hat kein/proc
Dateisystem und es/dev/stderr
ist ein Link zu/dev/fd/2
.Weiterführende Literatur:
quelle
2> bla.log
würde funktionieren, solange Sie Pipe zu2
und nicht Hard-Code/dev/stderr
. Grundsätzlich2
nicht brauchte der seinenstderr
Ausgang.In Bash und anderen Shells besteht die Möglichkeit, etwas auf Standardfehler umzuleiten, darin , es zu verwenden
>&2
. Bash wird/dev/stderr
als Dateideskriptor geöffnet2
. Filedeskriptoren referenziert von&N
woN
die Zahl des Deskriptors. Alsoecho error >&2
wirderror
nach Standardfehler gedruckt , um/dev/stderr
.Es wird auch
/dev/stdout
als Dateideskriptor geöffnet1
. Dies bedeutet, dass Sie tun könnenecho output >&1
. Da jedoch ohnehin standardmäßig alles auf Standardausgabe gedruckt wird, ist dies dasselbe wieecho output
für sich.Jetzt
2>
ist anders. Hier leiten Sie die Fehlerausgabe eines Befehls an eine andere Stelle um. Bedeutet2>file
also "alles, was in Dateideskriptor 2 gedruckt wurde (Standardfehler), umleiten nachfile
".quelle
Sie haben Recht,
>&2
ist direkter und vollkommen "idiomatisch". Sie sollten gleichwertig sein, daher gibt es keinen besonderen Grund für die Verwendung>/dev/stderr
. Abgesehen davon, wenn jemand, der liest, nicht weiß, was diese tun, ist einer von ihnen wahrscheinlich leichter herauszufinden als der andere :-). Aber im Allgemeinen würde ich vorschlagen, dass Sie verwenden>&2
./ dev / stderr kann nützlich sein, wenn Programme Fehler in einen angegebenen Dateinamen schreiben, stderr jedoch nicht unterstützen. Dies ist eindeutig ein bisschen erfunden; / dev / stdout ist viel nützlicher. (Ich habe kürzlich festgestellt, dass das
mysql_safe
Wrapper-Skript keine Fehler in die Konsole schreibt. Leider möchte es auch die Berechtigungen für die Fehlerprotokolldatei ändern, sodass die Verwendung von / dev / stderr einige überflüssige Warnungen verursacht.)quelle