(6 respuestas)
Cerrado hace 6 años.
Me gustaría evitar que mi programa envíe stdout y stderr a cualquier terminal, archivo o dispositivo. Para esto, tengo tres comandos cruzando mi mente, pero no puedo distinguir sus diferencias. ¿Podría explicarme el significado de cada uno de ellos, por favor?
# ./run > /dev/null
# ./run > /dev/null 1>&2
# ./run > /dev/null 2>&1
Respuesta aceptada:
# ./run > /dev/null
Esto redirige la salida estándar a /dev/null
, pero no hace nada en absoluto con stderr. Dado que solicitó redirigir desde stdout y stderr, esto no hace lo que desea.
# ./run > /dev/null 1>&2
Esto redirige la salida estándar a /dev/null
, y luego redirige stdout nuevamente (1>
) a cualquier lugar al que apunte stderr (&2
) que es probablemente la terminal y es probablemente donde apuntó stdout antes de redirigirla. Entonces, el efecto neto aquí es (probablemente) ninguna redirección para stdout, y en cuanto a stderr, todavía no haces nada con él. Así que esto tampoco es lo que quieres.
# ./run > /dev/null 2>&1
Esto redirige la salida estándar a /dev/null
, y luego redirige stderr (2>
) a donde apunte la salida estándar, que es /dev/null
porque ahí es donde acabas de redirigirlo. Esto parece ser lo que quieres.
No puedo distinguir sus diferencias.
En realidad, debería poder distinguir las diferencias con bastante facilidad. Digamos ./run
contiene esto:
#!/bin/sh
echo stdout
echo stderr >&2
Entonces los resultados deberían ser los siguientes:
# ./run > /dev/null
stderr
# ./run > /dev/null 1>&2
stdout
stderr
# ./run > /dev/null 2>&1
¡La diferencia es clara!