¿Por qué se redirecciona STDERR a / dev / null de esta manera?

29

Esto no tiene sentido para mi.

wibble > /dev/null 2>&1

Creo que tendría más sentido si fuera algo como esto:

wibble 2>&1 > /dev/null

En otras palabras

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

¿Cuál es el pensamiento detrás del orden de la redirección de comandos xxx > /dev/null 2>1?

quién soy
fuente
66
También puede encontrar útil esta explicación .
rozcietrzewiacz
Gracias @rozcietzewiacz que realmente explica mi pregunta exactamente
whoami
1
Hay un excelente pasaje en el medio de esa página en el Wiki de Greg: “Si todavía estás confundido en este punto, probablemente sea porque comenzaste con una idea errónea sobre cómo funcionan los DF, y no has podido dejar esa idea falsa todavía. No se preocupe, es un error muy común y no está solo. ... Mucha gente piensa que de 2>&1alguna manera "une" o "une" o "se casa" con los dos DF, de modo que cualquier cambio [posterior] en uno de ellos se convierte en un cambio en el otro. Este no es el caso. ”
G-Man dice 'Reincorporar a Monica' el

Respuestas:

41

Las redirecciones se procesan de izquierda a derecha. Si lo haces

2>&1 1> /dev/null

La primera redirección stderrapunta al flujo que stdoutapunta en ese momento (que es su tty esencialmente). No hace stderrun alias de stdout.

Luego stdoutse redirige al segmento de bits. La stdoutredirección no afecta la stderrredirección anterior . stderrTodavía se refiere a tu tty.

Asi que:

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

imprimirá solo el mensaje de error en su terminal.

La bashpágina de documentación de redirección menciona esto explícitamente:

Tenga en cuenta que el orden de las redirecciones es significativo. Por ejemplo, el comando

          ls > dirlist 2>&1

dirige tanto la salida estándar como el error estándar a la lista de archivos, mientras que el comando

          ls 2>&1 > dirlist

dirige solo la salida estándar a dirlist de archivo, porque el error estándar se duplicó de la salida estándar antes de que la salida estándar se redirigiera a dirlist .

Estera
fuente
3
Yay resuelve mi enigma. Todavía creo que lógicamente es confuso. pero me encontré otra parte en la misma página que es interesante &>/dev/nulles semánticamente equivalente a/dev/null 2>&1
whoami
1
Debe enfatizarse que la página de la que está hablando es parte del Manual de referencia de Bash . Obviamente, describe bash . Hay otras conchas en el mundo, diferentes de fiesta, y &>e >&(cuando no se utiliza en el contexto 2>&1o >&2, etc.) son Bash-ismos y no son estándar . No deben usarse en scripts de shell que desee que sean portátiles.
G-Man dice 'Reincorporar a Monica' el