Como han dicho los demás, Linux proporciona dos flujos de salida diferentes:
stdout o "salida estándar" es donde va toda la salida regular.
Puede referenciarlo utilizando el descriptor de archivo 1
.
stderr , o "error estándar" es una secuencia separada para información fuera de banda.
Puede referenciarlo utilizando el descriptor de archivo 2
.
¿Por qué dos flujos de salida diferentes? Considere una tubería de comandos imaginarios:
decrypt $MY_FILE | grep "secret" | sort > secrets.txt
Ahora imagine que el decrypt
comando falla y genera un mensaje de error. Si enviara ese mensaje stdout
, lo enviaría a la tubería y, a menos que tuviera la palabra "secreto", nunca lo vería. Así que terminarías con un archivo de salida vacío, sin tener idea de lo que salió mal.
Sin embargo, dado que la tubería solo captura stdout
, el decrypt
comando puede enviar sus errores a stderr
donde se mostrarán en la consola.
Puede redirigir stdout
y stderr
, juntos o de forma independiente:
# Send errors to "errors.txt" and output to "secrets.txt"
# The following two lines are equivalent, as ">" means "1>"
decrypt $MY_FILE 2> errors.txt > secrets.txt
decrypt $MY_FILE 2> errors.txt 1> secrets.txt
Puede redirigir los errores stdout
y procesarlos como si fueran resultados normales:
# The operation "2>&1" means "redirect file descriptor 2 to file
# descriptor 1. So this sends all output from stderr to stdout.
# Note that the order of redirection is important.
decrypt $MY_FILE > errors.txt 2>&1
# This may be confusing. It will store the normal output in a file
# and send error messages to stdout, where they'll be captured by
# the pipe and then sorted.
decrypt $MY_FILE 2>&1 > output.txt | sort
También puede utilizar una notación "abreviada" para redirigir tanto stdout y stderr al mismo archivo:
decrypt $MY_FILE &> output.txt
Y, finalmente, el >
operador primero truncará su archivo de salida antes de escribir en él. Si, en cambio, desea agregar datos a un archivo existente, use el >>
operador:
decrypt $MY_FILE 2>> more_errors.txt >> more_secrets.txt
decrypt $MY_FILE >> more_output.txt 2>&1