Risposte:
In &in 2>&1dice semplicemente che il numero 1è un descrittore di file e non un nome di file. In questo caso il standard output file descriptor.
Se lo usi 2>1, questo reindirizzerebbe gli errori a un file chiamato 1ma se lo usi 2>&1, lo invierebbe a standard output stream.
Questo &>dice inviare entrambi standard outpute standard error, da qualche parte. Per esempio, ls <non-existent_file> &> out.file. Permettetemi di illustrarlo con un esempio.
Impostare:
Crea un file kokocon il seguente contenuto:
#!bin/bash
ls j1
echo "koko2"
Renderlo eseguibile: chmod u+x koko
Ora nota che j1non esiste
Adesso corri ./koko &> output
corri cat outpute vedrai
ls: cannot access 'j1': No such file or directory
koko2
Entrambi, standard error( ls: cannot access 'j1': No such file or directory) e standard output( koko2), sono stati inviati al file output.
Ora eseguilo di nuovo, ma questa volta in questo modo:
./koko > output
Fai cat outpute vedrai solo cose koko2simili. Ma non l'errore generato dal ls j1comando. Questo verrà inviato a quello standard errorche vedrai nel tuo terminale.
Nota importante grazie a @Byte Commander:
Si noti che command >file 2>&1nell'ordine del reindirizzamento è importante. Se command 2>&1 >fileinvece scrivi (che normalmente non è quello che desideri), reindirizzerà prima i comandi stdoutal file e successivamente reindirizzerà i comandi stderral suo ora inutilizzato stdout, quindi verrà visualizzato nel terminale e potresti reindirizzarlo o reindirizzarlo di nuovo, ma non verrà scritto nel file.
command >file 2>&1nell'ordine dei reindirizzamenti è importante. Se command 2>&1 >fileinvece scrivi (che normalmente non è quello che vuoi), reindirizzerà prima lo stdout del comando al file e successivamente reindirizzerà lo stderr del comando al suo stdout ora inutilizzato, quindi verrà visualizzato nel terminale e potresti pipe o reindirizzarlo di nuovo, ma non verrà scritto nel file.
standard outputche vedrai nel tuo terminale." questo non dovrebbe essere "al standard error"?
> FILE 2>&1e &> FILEsono equivalenti. Vedi 8.2.3.2. Reindirizzamento degli errori nella Guida di Bash per principianti, capitolo 8
&> FILEè specifico solo per Bash mentre >FILE 2>&1è compreso da un maggior numero di shell.
Si [n]>&wordchiama Duplicating Output File Descriptor (vedere la sezione 2.7.6 di POSIX Shell Language Standard). Questo comportamento particolare è una caratteristica delle conchiglie simili a bourne, tra cui ksh,dash e bash; infatti, lo standard si basa sulla shell Bourne e ksh. Esaminando i manuali tcsh e csh , a quanto pare non forniscono la capacità di duplicare alcun descrittore di file, tuttavia dalla descrizione di >&, ciò si comporta come &>in bash(cioè reindirizza gli errori e il normale output su file).
Nei sistemi * nix, incluso Ubuntu, spesso senti che tutto è un file, o piuttosto un descrittore di file . L'output standard è il descrittore di file costante 1 e l'errore standard è il descrittore di file 2. Quindi, > FILE 2>&1tecnicamente significa descrittore di file duplicato 2 sul descrittore di file 1. In altre parole di questa risposta :
2> & 1 dice alla shell di dare al comando un descrittore di file 2 che è un duplicato del descrittore 1. (cioè stderr e stdout puntano allo stesso fd).
La chiave qui è notare che il descrittore 1 deve essere impostato per primo. Poiché la shell elabora i reindirizzamenti nell'ordine da sinistra a destra, command >FILE 2>&1dice alla shell di ricollegare stdout per commandentrare per FILEprima, e solo allora il descrittore 2 può diventare una copia di 1, ovvero 1 e 2 puntano nella stessa posizione - FILE.
Questo ovviamente va oltre l'errore standard e l'output standard. Come mostrato in questa risposta , facendo3&>2
... duplicate (dup2) filedescritor 2 su filedescriptor 3, possibilmente chiudendo filedescriptor 3 se è già aperto
Sarebbe un esempio di manipolazione dei descrittori di file, tra i tanti catturare l'output del dialogcomando in una variabile
Vale anche la pena notare che &>è specifico bash. In zshquesto si comporta allo stesso modo, ma secondo la documentazione, "... non ha lo stesso effetto di '> word 2> & 1' in presenza di multios". In conformità a POSIX /bin/sh, questo viene trattato come un reindirizzamento regolare con l'inserimento del comando in background. Vedi anche, c'è qualche codice sh che non è codice bash sintatticamente valido? .
Guarda anche:
&>cattiva?