Es ist viel einfacher, Dinge zu visualisieren, wenn Sie darüber nachdenken, was mit "Weiterleitungen" und "Pipes" wirklich los ist. Weiterleitungen und Pipes in bash bewirken eines: Ändern Sie, wohin die Prozessdateideskriptoren 0, 1 und 2 zeigen (siehe / proc / [pid] / fd / *).
Wenn ein Rohr oder "|" Der Operator ist in der Befehlszeile vorhanden. Als Erstes erstellt bash ein Fifo und zeigt die FD 1 des Befehls auf der linken Seite auf dieses Fifo und zeigt die FD 0 des Befehls auf der rechten Seite auf dasselbe Fifo.
Als nächstes werden die Umleitungsoperatoren für jede Seite von links nach rechts ausgewertet , und die aktuellen Einstellungen werden verwendet, wenn eine Duplizierung des Deskriptors auftritt. Dies ist wichtig, da FD1 (linke Seite) und FD0 (rechte Seite) seit dem ersten Einrichten der Pipe bereits von dem geändert wurden, was sie normalerweise gewesen sein könnten, und jede Verdoppelung dieser wird diese Tatsache widerspiegeln.
Wenn Sie also Folgendes eingeben:
command 2>&1 >/dev/null | grep 'something'
Folgendes passiert in der Reihenfolge:
- Eine Pipe (Fifo) wird erstellt. "Befehl FD1" zeigt auf diese Pipe. "grep FD0" zeigt ebenfalls auf diese Pipe
- "Befehl FD2" zeigt auf die Stelle, an der "Befehl FD1" aktuell zeigt (die Pipe)
- "Befehl FD1" zeigt auf / dev / null
Alle Ausgaben, die "command" in seinen FD 2 (stderr) schreibt, gelangen in die Pipe und werden von "grep" auf der anderen Seite gelesen. Alle Ausgaben, die "Befehl" in seine FD 1 (stdout) schreibt, gelangen nach / dev / null.
Wenn Sie stattdessen Folgendes ausführen:
command >/dev/null 2>&1 | grep 'something'
Folgendes passiert:
- Eine Pipe wird erstellt und "Befehl FD 1" und "grep FD 0" werden darauf gezeigt
- "Befehl FD 1" zeigt auf / dev / null
- "Befehl FD 2" zeigt auf die Stelle, an der FD 1 aktuell zeigt (/ dev / null)
Also gehen alle stdout und stderr von "command" nach / dev / null. Es geht nichts in die Pipe, und daher wird "grep" geschlossen, ohne dass etwas auf dem Bildschirm angezeigt wird.
Beachten Sie auch, dass Weiterleitungen (Dateideskriptoren) schreibgeschützt (<), schreibgeschützt (>) oder schreibgeschützt (<>) sein können.
Eine letzte Anmerkung. Ob ein Programm etwas in FD1 oder FD2 schreibt, liegt ganz beim Programmierer. Die gute Programmierpraxis schreibt vor, dass Fehlermeldungen an FD 2 und die normale Ausgabe an FD 1 gesendet werden müssen. Sie werden jedoch häufig eine schlampige Programmierung finden, die beide vermischt oder die Konvention auf andere Weise ignoriert.