Cosa significa esattamente nel reindirizzamento dell'output?


19

Vedo cose come command 1> outo con cui 2>&1reindirizzare stderr, ma a volte vedo anche &>da solo, ecc.

Qual è il modo migliore per capire &e cosa significa esattamente?

Risposte:


26

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:

  1. Crea un file kokocon il seguente contenuto:

    #!bin/bash
    
    ls j1
    echo "koko2"
    
  2. Renderlo eseguibile: chmod u+x koko

  3. Ora nota che j1non esiste

  4. Adesso corri ./koko &> output

  5. 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.


2
Che cosa è &>cattiva?
AJJ,

1
Si noti che 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.
Byte Commander

2
"Questo verrà inviato a quello standard outputche vedrai nel tuo terminale." questo non dovrebbe essere "al standard error"?
frarugi87,

1
Sì, @frarugi87, la tua destra è stata corretta
George Udosen,

1
@George wow, sei stato veloce;) Ottimo lavoro
frarugi87


1

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:

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.