Wie studerst du stderr, und nicht stdout?
Ich habe ein Programm, schreibt Informationen in stdout
und stderr
und ich muss grep
durch, was kommt, um stderrwährend man für stdout.
Kann ich natürlich tun, es in 2 Schritten:
command > /dev/null 2> temp.file
grep 'something' temp.file
aber ich würde lieber in der Lage sein, dies zu tun, ohne temp-Dateien. Gibt es irgendwelche smart Rohrleitungen tricks?
InformationsquelleAutor der Frage | 2010-02-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ersten umleiten von stderr zu stdout — das Rohr; dann umleiten von stdout zu
/dev/null
(ohne Veränderung, wo stderr wird):Für die details des I/O-Umleitung in all Ihrer Vielfalt, siehe Kapitel Umleitungen in der Bash reference manual.
Beachten Sie, dass die Reihenfolge der I/O-Umleitungen interpretiert von Links nach rechts, aber die Rohre sind eingerichtet, bevor die I/O-Umleitungen interpretiert werden. Datei-Deskriptoren, etwa 1 und 2 sind Referenzen auf Datei-öffnen-Beschreibungen. Der Betrieb
2>&1
macht file-Deskriptor 2 aka stderr beziehen sich auf die gleiche Datei öffnen Beschreibung als Datei-Deskriptor 1 aka stdout ist derzeit unter Bezugnahme auf (siehedup2()
undopen()
). Der Betrieb>/dev/null
dann ändert Datei-Deskriptor-1, so dass es sich um eine Datei öffnen Beschreibung für/dev/null
aber das ändert nichts an der Tatsache, dass file-Deskriptor 2 bezieht sich auf die geöffnete Datei Beschreibung die Datei-Deskriptor-1 wurde ursprünglich verweist — nämlich die pipe.InformationsquelleAutor der Antwort Jonathan Leffler
Oder zu tauschen, die Ausgabe von stderr und stdout über: - die Verwendung
Dies erstellt eine neue Datei-Deskriptor (3) und weist ihn auf die gleiche Stelle wie 1 (stdout), dann weist fd 1 (stdout) an der gleichen Stelle, fd 2 (stderr) und schließlich weist fd 2 (stderr) auf den gleichen Platz wie fd 3 (stdout). Stderr ist jetzt als Standardausgabe und alte stdout erhalten in stderr. Dies ist möglicherweise übertrieben, aber hoffentlich gibt mehr details auf bash Datei-Deskriptoren (es gibt 9 jeder Prozess).
InformationsquelleAutor der Antwort Kramish
In der Bash können Sie auch die Umleitung zu einer subshell mit Prozess-substitution:
Sich für den Fall zur hand haben:
InformationsquelleAutor der Antwort Rich Johnson
Kombinieren das beste aus diesen Antworten, wenn Sie:
command 2> >(grep -v something 1>&2)
...dann alle stdout ist bewahrt als stdout und alle stderr ist bewahrt als stderr, aber sehen Sie keine Linien in stderr mit der Zeichenfolge "etwas".
Dies hat den einzigartigen Vorteil, dass Sie nicht umkehren oder verwerfen, stdout und stderr, noch smushing Sie zusammen, noch mit irgendwelchen temporären Dateien.
InformationsquelleAutor der Antwort Pinko
Ist es viel einfacher, Dinge zu visualisieren, wenn Sie darüber nachdenken, was wirklich Los ist mit "Weiterleitungen" und "Rohre." Umleitungen und pipes in der bash eine Sache zu tun: ändern Sie, wo die Prozess-Dateideskriptoren 0, 1 und 2 zeigen (siehe /proc/[pid]/fd/*).
Wenn ein Rohr oder " | " - operator vorhanden ist, auf die Befehlszeile, die erste Sache, die geschehen ist, dass die bash erstellt eine fifo-und die Punkte der linken Seite des Befehls FD 1 zu diesem fifo, und die Punkte der rechten Seite des Befehls FD 0 den gleichen fifo.
Neben -, Umleitungs-Operatoren für jede Seite bewertet werden von Links nach rechtsund die aktuellen Einstellungen werden immer dann verwendet, wenn die Vervielfältigung des Deskriptors erfolgt. Dies ist wichtig, weil da das Rohr war die ersten, die FD1 (Links) und FD0 (rechts) sind bereits geändert, von dem, was Sie normalerweise wurden, und jegliche Vervielfältigung dieser werden dieser Tatsache Rechnung tragen.
Daher, wenn Sie etwas wie das folgende:
Hier ist, was passiert, in der Reihenfolge:
So, alle Ausgaben, dass "Befehl" schreibt, um seine FD 2 (stderr) macht sich auf den Weg, um das Rohr und wird gelesen von "grep" " auf der anderen Seite. Alle Ausgaben, die "Befehl" schreibt, um seine FD 1 (stdout) macht sich auf den Weg nach /dev/null.
Wenn du stattdessen Folgendes ausführen:
Hier ist, was passiert:
So, alle stdout und stderr von "Befehl" gehe zu /dev/null. Nichts geht in die pipe und damit "grep" wird geschlossen, ohne dass etwas angezeigt auf dem Bildschirm.
Beachten Sie auch, dass Umleitungen (file Deskriptoren) können nur gelesen werden (<), nur schreiben (>) oder read-write (<>).
Erwähnenswert. Ob ein Programm schreibt etwas auf FD1 oder FD2, kommt ganz auf den Programmierer. Gute Programmier-Praxis diktiert, dass die Fehlermeldungen gehen sollte, FD 2 und einen normalen output, FD 1, aber Sie werden oft finden die schlampige Programmierung, die Mischungen, die zwei oder anderweitig ignoriert die Konvention.
InformationsquelleAutor der Antwort Michael Martinez
Benutzt du die bash? Wenn ja:
http://www.gnu.org/software/bash/manual/bashref.html#Pipelines
InformationsquelleAutor der Antwort Ken Sharp
Für diejenigen, die wollen umleiten von stdout und stderr permanent in Dateien grep auf stderr, aber halten Sie die stdout zu schreiben, Nachrichten an ein tty:
InformationsquelleAutor der Antwort JBD
Dieser leitet command1 stderr in command2 um stdin, während command1 stdout.
Entnommen LDP
InformationsquelleAutor der Antwort theDolphin
Ich kam gerade mit einer Lösung für das senden
stdout
zu einem Befehlstderr
zum anderen, mithilfe von named pipes.Hier geht.
Ist es wahrscheinlich eine gute Idee, entfernen Sie die named pipes danach.
InformationsquelleAutor der Antwort Tripp Kinetics
Ich versuche zu Folgen, es finden so gut funktionieren,
InformationsquelleAutor der Antwort lasteye