Come hanno detto gli altri, Linux fornisce due diversi flussi di output:
stdout , o "output standard" è dove va tutto l'output normale.
Puoi fare riferimento usando il descrittore di file 1
.
stderr , o "errore standard" è un flusso separato per informazioni fuori banda.
Puoi fare riferimento usando il descrittore di file 2
.
Perché due diversi flussi di output? Considera una pipeline di comandi immaginari:
decrypt $MY_FILE | grep "secret" | sort > secrets.txt
Ora immagina che il decrypt
comando fallisca e generi un messaggio di errore. Se avesse inviato quel messaggio a stdout
, lo avrebbe spedito nel tubo, e se non avesse la parola "segreto" non lo vedresti mai. Quindi finiresti con un file di output vuoto, senza idea di cosa sia andato storto.
Tuttavia, poiché la pipe acquisisce solo stdout
, il decrypt
comando può inviare i suoi errori a stderr
, dove verranno visualizzati sulla console.
Puoi reindirizzare stdout
e stderr
, insieme o indipendentemente:
# 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
È possibile reindirizzare gli errori stdout
ed elaborarli come se fossero output normali:
# 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
Puoi anche usare una notazione "abbreviata" per reindirizzare sia stdout che stderr allo stesso file:
decrypt $MY_FILE &> output.txt
E, infine, l' >
operatore troncerà prima il suo file di output prima di scriverlo. Se, invece, desideri aggiungere dati a un file esistente, usa l' >>
operatore:
decrypt $MY_FILE 2>> more_errors.txt >> more_secrets.txt
decrypt $MY_FILE >> more_output.txt 2>&1