Warum wird STDERR auf diese Weise nach / dev / null umgeleitet?


28

Das ergibt für mich keinen Sinn.

wibble > /dev/null 2>&1

Ich denke, es wäre sinnvoller, wenn es so etwas wäre:

wibble 2>&1 > /dev/null

Mit anderen Worten

Commands Output Sendall STDERRORS to STDOUT then SEND it all to /dev/null

Welche Überlegungen stecken hinter der Reihenfolge der Befehlsumleitung xxx > /dev/null 2>1?


6
Diese Erklärung könnte auch hilfreich sein.
rozcietrzewiacz

Vielen Dank an @rozcietzewiacz, der meine Frage genau erklärt
whoami

1
Es gibt eine ausgezeichnete Passage in der Mitte dieser Seite in Gregs Wiki: „Wenn Sie zu diesem Zeitpunkt immer noch verwirrt sind, liegt das wahrscheinlich daran, dass Sie mit einem Missverständnis darüber begonnen haben, wie FDs funktionieren, und dass Sie dieses Missverständnis nicht fallen lassen konnten noch. Mach dir keine Sorgen - es ist ein extrem häufiges Missverständnis, und du bist nicht allein. ... Viele Leute denken , dass 2>&1irgendwie „eint“ oder „Verbindungen zusammen“ oder „verheiratet“ , die beiden FDs, so dass jede [nachfolgende] Wechsel zu einem von ihnen eine Änderung des anderen wird. Dies ist nicht der Fall. “
G-Man sagt, dass Monica

Antworten:


40

Die Weiterleitungen werden von links nach rechts verarbeitet. Wenn Sie tun

2>&1 1> /dev/null

Die erste Umleitung verweist stderrauf den Stream, stdoutder zu diesem Zeitpunkt darauf verweist (was im Wesentlichen Ihre Tty ist). Es macht keinen stderrAlias ​​aus stdout.

Dann stdoutwird zum Bit-Bucket umgeleitet. Die stdoutUmleitung wirkt sich nicht auf die vorherige stderrUmleitung aus. stderrbezieht sich immer noch auf dein tty.

So:

ls file_that_doesnt_exist 2>&1 1> /dev/null

druckt nur die Fehlermeldung auf Ihrem Terminal.

Die bashWeiterleitungsdokumentationsseite erwähnt dies explizit:

Beachten Sie, dass die Reihenfolge der Umleitungen wichtig ist. Zum Beispiel der Befehl

          ls > dirlist 2>&1

Leitet während des Befehls sowohl die Standardausgabe als auch den Standardfehler an die Dateiverzeichnisliste

          ls 2>&1 > dirlist

Leitet nur die Standardausgabe an die Dateidirlist weiter, da der Standardfehler von der Standardausgabe dupliziert wurde, bevor die Standardausgabe an die Dirlist weitergeleitet wurde .


3
Yay löst mein Rätsel. Ich denke immer noch logisch, dass es verwirrend ist. aber ich fand einen anderen Teil auf der gleichen Seite, der interessant &>/dev/nullist, ist semantisch äquivalent zu/dev/null 2>&1
whoami

1
Es sollte betont werden, dass die Seite, über die Sie sprechen, Teil des Bash- Referenzhandbuchs ist. Es beschreibt offensichtlich bash . Es gibt auch andere Muscheln in der Welt, die sich von bash, und &>und >&(wenn verwendet nicht im Kontext 2>&1oder >&2, etc.) sind bash-isms und sind nicht Standard . Sie sollten nicht in Shell-Skripten verwendet werden, die portierbar sein sollen.
G-Man sagt, dass Monica
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.