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
2STDERR 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/resultsund 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>&1operator erreicht
grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1
Das &ermöglicht bash aus einer Datei zu unterscheiden benannt 1und den 1Dateideskriptor.
Für mich 2>&1erklärt die Anweisung selbst genau, was passiert - STDERR wird an STDOUT selbst umgeleitet - und endet nur damit, /tmp/resultsdass auf STDOUT verwiesen wird (fast als Nebeneffekt).
Im Gegensatz zu dem, was viele Guides behaupten, was 2>&1STDERR 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 dasstdoutundstderrzusammenmischen, um zu sehen, was wirklich vor sich geht - wie die Ausgabe eines komplexen Kompilierungsprozesses, der in eine Datei umgeleitet wird. In diesem Fall