Como os outros disseram, o linux fornece dois fluxos de saída diferentes:
stdout , ou "saída padrão" é onde vai toda a saída regular.
Você pode referenciá-lo usando o descritor de arquivo 1
.
stderr ou "erro padrão" é um fluxo separado para informações fora de banda.
Você pode referenciá-lo usando o descritor de arquivo 2
.
Por que dois fluxos de saída diferentes? Considere um pipeline de comandos imaginários:
decrypt $MY_FILE | grep "secret" | sort > secrets.txt
Agora imagine o decrypt
comando falha e gera uma mensagem de erro. Se ele enviou essa mensagem para stdout
, ele enviaria para o tubo e, a menos que tivesse a palavra "secreto", você nunca o veria. Então você acabaria com um arquivo de saída vazio, sem ideia do que deu errado.
No entanto, como o tubo captura apenas stdout
, a decrypt
comando pode enviar seus erros para stderr
, onde eles serão exibidos no console.
Você pode redirecionar stdout
e stderr
, juntos ou independentemente:
# 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
Você pode redirecionar os erros para stdout
e processá-los como se fossem saída normal:
# 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
Você também pode usar uma notação "abreviada" para redirecionar ambos stdout e stderr para o mesmo arquivo:
decrypt $MY_FILE &> output.txt
E, finalmente, o >
operador primeiro truncar seu arquivo de saída antes de gravar nele. Se, em vez disso, você quiser acrescentar dados para um arquivo existente, use o >>
operador:
decrypt $MY_FILE 2>> more_errors.txt >> more_secrets.txt
decrypt $MY_FILE >> more_output.txt 2>&1