Per quanto riguarda la shell bash, trovo che il modo migliore per ricordare sia capire cosa sta succedendo.
Se tutto ciò che vuoi fare è ricordare come ottenere il comando corretto, potresti provare
program > /results 2> /results
È bello e ovvio cosa sta succedendo e facile da ricordare. vale a dire
1
STDOUT lo farà /results
2
Anche STDERR sta andando direttamente a/results
il problema è che questo non funziona come ci si aspetterebbe. considerare quanto segue:
file: /tmp/poem.txt
the quick brown fox jumped over the lazy dog
e esegui il comando
grep "brown" /tmp/poem.txt NOT_A_FILE > /tmp/results 2> /tmp/results
poi
$ cat /tmp/results
grep: NOT_A_FILE: No such file or directory
lazy dog
cos'è successo qua?
La mia comprensione è bash impostare il reindirizzamento che punta lo STDERR direttamente al file /tmp/results
e per la natura del >
quale fa 2 cose
- normalmente crea un nuovo file - in questo caso l'opportunità è passata poiché bash ha superato questa routine al momento della generazione dell'output.
- inserire direttamente all'inizio del file. e non aggiungere come
>>
fa.
Quindi, in questo caso STDERR, si inserisce direttamente all'inizio /tmp/results
dell'override dell'output di STDOUT.
Nota: se hai usato>>
accedeva, probabilmente si poteva cavarsela con questa sintassi.
Tuttavia, per risolvere il problema è necessario, non reindirizzare STDERR direttamente al file, ma piuttosto unire l'output di STDERR nel flusso STDOUT, in modo da non ottenere una collisione.
L'utilizzo dell'operatore 2>&1
operatore consente di ottenere questo risultato
grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1
Il &
permette bash da distinguere da un file chiamato 1
e il 1
descrittore di file.
Per me l'affermazione 2>&1
stessa spiega esattamente cosa sta succedendo - STDERR viene reindirizzato allo STDOUT stesso - e finisce solo /tmp/results
perché è lì che viene indicato STDOUT (quasi come un effetto collaterale).
Contrariamente a quanto sostengono molte guide, ovvero che 2>&1
invia STDERR a qualsiasi punto di STDOUT. Se ciò fosse vero, avresti comunque il problema di sovrascrittura.
Per ulteriori informazioni, vedere - http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirection
program 1> /dev/null 2>/dev/null
. Alcune volte però è necessario mescolarestdout
estderr
insieme per vedere cosa sta realmente succedendo, come l'output di un processo di compilazione complesso che viene reindirizzato a un file. In tal caso,