Risposte:
In &
in 2>&1
dice 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 1
ma se lo usi 2>&1
, lo invierebbe a standard output stream
.
Questo &>
dice inviare entrambi standard output
e standard error
, da qualche parte. Per esempio, ls <non-existent_file> &> out.file
. Permettetemi di illustrarlo con un esempio.
Impostare:
Crea un file koko
con il seguente contenuto:
#!bin/bash
ls j1
echo "koko2"
Renderlo eseguibile: chmod u+x koko
Ora nota che j1
non esiste
Adesso corri ./koko &> output
corri cat output
e 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 output
e vedrai solo cose koko2
simili. Ma non l'errore generato dal ls j1
comando. Questo verrà inviato a quello standard error
che vedrai nel tuo terminale.
Nota importante grazie a @Byte Commander:
Si noti che command >file 2>&1
nell'ordine del reindirizzamento è importante. Se command 2>&1 >file
invece scrivi (che normalmente non è quello che desideri), reindirizzerà prima i comandi stdout
al file e successivamente reindirizzerà i comandi stderr
al 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>&1
nell'ordine dei reindirizzamenti è importante. Se command 2>&1 >file
invece 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 output
che vedrai nel tuo terminale." questo non dovrebbe essere "al standard error
"?
> FILE 2>&1
e &> FILE
sono 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]>&word
chiama 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>&1
tecnicamente 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>&1
dice alla shell di ricollegare stdout per command
entrare per FILE
prima, 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 dialog
comando in una variabile
Vale anche la pena notare che &>
è specifico bash
. In zsh
questo 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?