Il comando Unix / Linux di Kyle svolge il compito di cambiare STDERR con STDOUT; tuttavia la spiegazione non è del tutto corretta. Gli operatori di reindirizzamento non eseguono alcuna copia o duplicazione, ma semplicemente reindirizzano il flusso in una direzione diversa.
Riscrivere il comando di Kyle spostando temporaneamente 3> & 1 alla fine, renderebbe più semplice la comprensione del concetto:
find /var/log 1>&2 2>&3 3>&1
Scritto in questo modo, però, Linux mostrerebbe un errore perché & 3 non esiste ancora poiché si trova prima di 3> & 1. 3> qualcosa è un modo per dichiarare (definire) che useremo un terzo tubo, quindi deve essere localizzato prima di far scorrere l'acqua in quel tubo, ad esempio il modo in cui Kyle l'ha scritto. Prova in questo modo solo per divertimento:
((echo "STD1"; anyerror "bbbb"; echo "STD2" ) 3>&1 4>&2 1>&4 2>&3) > newSTDOUT 2> newSTDERR
Non avere modo di fare copie è un peccato. Non puoi fare cose come "3> & 1 3> & 2" con lo stesso comando, perché Linux utilizzerà solo il primo trovato e rifiuta il secondo.
Non ho (ancora) trovato un modo per inviare sia l'errore che l'output normale a un file e anche inviare una copia dell'errore all'output standard con un solo comando. Per esempio, ho un lavoro cron che desidero che entrambi gli output (errore e standard) vadano in un file di registro e che anche l'errore vada fuori per inviare un messaggio e-mail al mio blackBerry. Posso farlo con due comandi usando "tee" ma l'errore non viene visualizzato nel giusto ordine tra la normale riga di output nel file. Questo è il brutto modo in cui ho risolto il problema:
((echo "STD1"; sdfr "bbbb"; echo "STD2" ) 3>&1 1>&2 2>&3 | tee -a log1 ) 2>> log1
Nota che devo usare due volte log1 e devo aggiungere in entrambi i casi, quello primo usando l'opzione "-a" per il comando "tee" e il secondo usando ">>".
Effettuando un registro cat1 si ottiene quanto segue:
STD1
STD2
-bash: sdfr: command not found
Si noti che l'errore non viene visualizzato nella seconda riga come dovrebbe.