Senden der Ausgabe an / dev / stderr vs.> & 2

11

In Skripten werden Fehler normalerweise an den Dateideskriptor 2 gesendet &2, dh:

echo "error" >&2

Manchmal /dev/stderrwird stattdessen verwendet:

echo "error" > /dev/stderr 

Beim Betrachten /dev/stderrsehe 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/stderrund &2gleichwertig?

Ist einer von denen dem anderen vorzuziehen?

Martin Vegter
quelle
3
echo "error" >2Erstellt eine Datei mit Name 2und Inhalt error.
Cyrus
Siehe auch
cuonglm
Ich sehe meine Bearbeitung wieder eingeführt & 2 anstelle von 2. Ist Ihre Frage tatsächlich über die Verwendung von >2, oder >&2?
Jeff Schaller

Antworten:

13

Das spezielle Gerät /dev/stderrist systemspezifisch, während der Dateideskriptor 2(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 /procDateisystem und es /dev/stderrist ein Link zu /dev/fd/2.

Weiterführende Literatur:

Thomas Dickey
quelle
Es gibt auch den Fall, dass jemand zB tun möchte. Dies 2> bla.logwürde funktionieren, solange Sie Pipe zu 2und nicht Hard-Code /dev/stderr. Grundsätzlich 2nicht brauchte der seinen stderrAusgang.
Larkey
6

In Bash und anderen Shells besteht die Möglichkeit, etwas auf Standardfehler umzuleiten, darin , es zu verwenden >&2. Bash wird /dev/stderrals Dateideskriptor geöffnet 2. Filedeskriptoren referenziert von &Nwo Ndie Zahl des Deskriptors. Also echo error >&2wird errornach Standardfehler gedruckt , um /dev/stderr.

Es wird auch /dev/stdoutals Dateideskriptor geöffnet 1. Dies bedeutet, dass Sie tun können echo output >&1. Da jedoch ohnehin standardmäßig alles auf Standardausgabe gedruckt wird, ist dies dasselbe wie echo outputfür sich.

Jetzt 2>ist anders. Hier leiten Sie die Fehlerausgabe eines Befehls an eine andere Stelle um. Bedeutet 2>filealso "alles, was in Dateideskriptor 2 gedruckt wurde (Standardfehler), umleiten nach file".

terdon
quelle
3

Sie haben Recht, >&2ist 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_safeWrapper-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.)

sourcejedi
quelle