Perché il reindirizzamento di STDERR su / dev / null viene eseguito in questo modo?


29

Questo non ha senso per me.

wibble > /dev/null 2>&1

Penso che avrebbe più senso se fosse qualcosa del genere:

wibble 2>&1 > /dev/null

In altre parole

Commands Output Sendall STDERRORS to STDOUT then SEND it all to /dev/null

Qual è il pensiero dietro l'ordine del reindirizzamento dei comandi xxx > /dev/null 2>1?


6
Potresti anche trovare utile questa spiegazione .
rozcietrzewiacz,

Grazie @rozcietzewiacz che in realtà spiega esattamente la mia domanda
whoami

1
C'è un passaggio eccellente nel mezzo di quella pagina sul Wiki di Greg: “Se sei ancora confuso a questo punto, probabilmente è perché hai iniziato con un malinteso su come funzionano gli FD e non sei stato in grado di abbandonare quel malinteso ancora. Non preoccuparti: è un malinteso estremamente comune e non sei solo. … Molte persone pensano che in 2>&1qualche modo “unisca” o “leghi insieme” o “sposino” i due FD, in modo che qualsiasi modifica [successiva] ad uno di essi diventi un cambiamento all'altro. Non è così. ”
G-Man dice 'Reinstate Monica' il

Risposte:


41

I reindirizzamenti vengono elaborati da sinistra a destra. Se fate

2>&1 1> /dev/null

Il primo reindirizzamento stderrpunta allo stream che stdoutpunta in quel momento (che è essenzialmente il tuo tty). Non fa stderrun alias di stdout.

Quindi stdoutviene reindirizzato al bucket bit. Il stdoutreindirizzamento non influisce sul stderrreindirizzamento precedente . stderrfa ancora riferimento al tuo tty.

Così:

ls file_that_doesnt_exist 2>&1 1> /dev/null

stamperà solo il messaggio di errore sul tuo terminale.

La bashpagina della documentazione di reindirizzamento menziona esplicitamente questo:

Si noti che l'ordine dei reindirizzamenti è significativo. Ad esempio, il comando

          ls > dirlist 2>&1

dirige sia l'output standard che l'errore standard all'elenco dei file, mentre il comando

          ls 2>&1 > dirlist

dirige solo l'output standard al dirlist del file, poiché l'errore standard è stato duplicato dall'output standard prima che l'output standard sia stato reindirizzato al dirlist .


3
Yay risolve il mio enigma. Penso ancora logicamente che sia confuso. ma ho trovato un'altra parte nella stessa pagina che è interessante &>/dev/nullè semanticamente equivalente a/dev/null 2>&1
whoami

1
Va sottolineato che la pagina di cui stai parlando fa parte del Manuale di riferimento di Bash . Ovviamente, descrive bash . Esistono altre shell nel mondo, diverse da bash e &>e >&(quando non utilizzate nel contesto 2>&1o >&2, ecc.) Sono bash-ismi e non sono standard . Non dovrebbero essere utilizzati negli script di shell che si desidera essere portatili.
G-Man dice "Ripristina Monica" il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.