Sto solo cercando la differenza tra
2>&-
2>/dev/null
|&
&>/dev/null
>/dev/null 2>&1
e la loro portabilità con shell non Bourne come tcsh
, mksh
, ecc.
Risposta accettata:
Per lo sfondo:
- un numero 1 =uscita standard (cioè STDOUT)
- un numero 2 =errore standard (es. STDERR)
- se un numero non viene fornito in modo esplicito, allora numero 1 è assunto dalla shell (bash)
Per prima cosa affrontiamo la funzione di questi. Per riferimento, vedere la Guida avanzata agli script Bash.
Funzioni
2>&-
La forma generale di questo è M>&-
, dove "M" è un numero di descrittore di file. Questo chiuderà l'output per qualsiasi descrittore di file a cui si fa riferimento, ad esempio "M" .
2>/dev/null
La forma generale di questo è M>/dev/null
, dove "M" è un numero di descrittore di file. Questo reindirizzerà il descrittore di file, "M" , su /dev/null
.
2>&1
La forma generale di questo è M>&N
, dove "M" &"N" sono i numeri del descrittore di file. Combina l'output dei descrittori di file "M" e "N" in un unico flusso.
|&
Questa è solo l'abbreviazione di 2>&1 |
. È stato aggiunto in Bash 4.
&>/dev/null
Questa è solo l'abbreviazione di >/dev/null 2>&1
. Reindirizza il descrittore di file 2 (STDERR) e il descrittore 1 (STDOUT) a /dev/null
.
>/dev/null
Questa è solo l'abbreviazione di 1>/dev/null
. Reindirizza il descrittore di file 1 (STDOUT) a /dev/null
.
Portabilità a non-bash, tcsh, mksh, ecc.
Non ho avuto a che fare molto con altre shell al di fuori di csh
e tcsh
. La mia esperienza con quei 2 rispetto agli operatori di reindirizzamento di bash, è che bash è superiore a questo riguardo. Vedi la pagina man di tcsh per maggiori dettagli.
Dei comandi che hai chiesto, nessuno è supportato direttamente da csh/tcsh. Dovresti usare sintassi diverse per costruire funzioni simili.