In Bezug auf die Bash-Shell finde ich, dass man sich am besten daran erinnert, wenn man versteht, was passiert.
Wenn Sie sich nur daran erinnern möchten, wie Sie den Befehl korrekt ausführen, können Sie es versuchen
program > /results 2> /results
Das ist schön und offensichtlich, was los ist und leicht zu merken ist. dh
1
STDOUT geht an /results
2
STDERR geht auch direkt an/results
Das Problem ist, dass dies nicht wie erwartet funktioniert. Folgendes berücksichtigen:
Datei: /tmp/poem.txt
the quick brown fox jumped over the lazy dog
und den Befehl ausführen
grep "brown" /tmp/poem.txt NOT_A_FILE > /tmp/results 2> /tmp/results
dann
$ cat /tmp/results
grep: NOT_A_FILE: No such file or directory
lazy dog
was ist hier passiert?
Mein Verständnis ist Bash-Setup die Umleitung der STDERR direkt auf die Datei /tmp/results
und aufgrund der Art der >
2 Dinge
- normalerweise eine neue Datei erstellen - in diesem Fall die Möglichkeit bestanden hat , wie bash Vergangenheit dieser Routine zu dem Zeitpunkt wird der Ausgang erzeugt bewegt hat.
- Direkt an den Anfang der Datei einfügen. und nicht anhängen wie es
>>
tut.
In diesem Fall wird also STDERR direkt an den Anfang des /tmp/results
Überschreibens der Ausgabe von STDOUT eingefügt.
Hinweis: Wenn Sie verwendet werden >>
Sie wahrscheinlich mit dieser Syntax wegkommen könnte anhängen.
Um das Problem zu beheben, müssen Sie STDERR jedoch nicht direkt in die Datei umleiten, sondern die STDERR-Ausgabe in den STDOUT-Stream einbinden, damit keine Kollision auftritt. Dies wird durch die
Verwendung des Operators 2>&1
operator erreicht
grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1
Das &
ermöglicht bash aus einer Datei zu unterscheiden benannt 1
und den 1
Dateideskriptor.
Für mich 2>&1
erklärt die Anweisung selbst genau, was passiert - STDERR wird an STDOUT selbst umgeleitet - und endet nur damit, /tmp/results
dass auf STDOUT verwiesen wird (fast als Nebeneffekt).
Im Gegensatz zu dem, was viele Guides behaupten, was 2>&1
STDERR dahin schickt, wohin STDOUT zeigt. Wenn das wahr wäre, hätten Sie immer noch das Überschreibproblem.
Weitere Informationen finden Sie unter http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirection
program 1> /dev/null 2>/dev/null
. Manchmal müssen Sie jedoch dasstdout
undstderr
zusammenmischen, um zu sehen, was wirklich vor sich geht - wie die Ausgabe eines komplexen Kompilierungsprozesses, der in eine Datei umgeleitet wird. In diesem Fall