Che cosa significa esattamente nel reindirizzamento dell'output?

14

Vedo cose come command 1> out o con 2>&1 per reindirizzare stderr, ma a volte vedo anche &> di per sé, ecc.

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

    
posta Aruka J 25.09.2017 - 00:37
fonte

3 risposte

21

Il & in 2>&1 dice semplicemente che il numero 1 è un descrittore di file e non un nome di file. In questo caso standard output file descriptor .

Se utilizzi 2>1 , questo reindirizza gli errori a un file chiamato 1 , ma se utilizzi 2>&1 , lo invierebbe a standard output stream .

Questo &> dice di inviare entrambi, standard output e standard error , da qualche parte. Ad esempio, ls <non-existent_file> &> out.file . Lasciatemi illustrare questo con un esempio.

Configurazione:

  1. Crea un file koko con il seguente contenuto:

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

  3. Ora nota che j1 non esiste

  4. Ora esegui ./koko &> output

  5. esegui 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 koko2 come. Ma non l'errore emesso dal comando ls j1 . Questo verrà inviato al standard error che vedrai nel tuo terminale.

Nota importante grazie a @Byte Commander:

Da notare che in command >file 2>&1 l'ordine del reindirizzamento è importante. Se scrivi command 2>&1 >file invece (che normalmente non è quello che desideri), per prima cosa reindirizzerà stdout del comando al file e successivamente reindirizzerà stderr del comando al suo stdout inutilizzato, quindi mostrerà nel terminale e potresti reindirizzare o reindirizzare di nuovo, ma non verrà scritto sul file.

    
risposta data George Udosen 25.09.2017 - 00:55
fonte
4

> FILE 2>&1 e &> FILE sono equivalenti. Vedi 8.2.3.2. Reindirizzamento degli errori di in Guida di Bash per principianti Capitolo 8

    
risposta data J. Starnes 25.09.2017 - 00:58
fonte
0

Il [n]>&word è chiamato Duplicating Output File Descriptor (vedi sezione 2.7 .6 di POSIX Shell Language Standard). Questo particolare comportamento è una caratteristica delle shell di tipo Bourne, tra cui ksh , dash e bash ; infatti, lo standard è basato su Bourne shell e ksh . Esaminando tcsh e csh , apparentemente non forniscono la possibilità di duplicare alcun descrittore di file, tuttavia dalla descrizione di >& , questo si comporta come &> in bash (cioè, reindirizza gli errori e l'output normale a file).

In * nix come i sistemi, incluso Ubuntu, senti spesso 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 significa tecnicamente duplicato descrittore di file 2 sul descrittore di file 1. In altre parole di questa risposta :

  

Il 2 & gt; & amp; 1 dice alla shell di dare al comando un descrittore di file 2 che è un duplicato del descrittore 1. (cioè, stderr & amp; stdout punta allo stesso file).

La chiave qui è di notare che il descrittore 1 deve essere impostato per primo. Poiché la shell elabora i reindirizzamenti nell'ordine da sinistra a destra, la command >FILE 2&1 dice alla shell di ricablare lo stdout per command per andare in FILE prima, e solo allora il descrittore 2 può diventare una copia di 1, cioè 1 e 2 punti allo stesso posizione - FILE .

Ovviamente questo va oltre l'errore standard e l'output standard. Come mostrato in questa risposta , facendo 3&>2

  

... duplichi (dup2) filedescritor 2 su filedescriptor 3, eventualmente chiudendo il file schededescriptor 3 se è già aperto

Esempio di manipolazione dei descrittori di file, tra molti, sarebbe catturare l'output del comando dialog nella variabile

Vale anche la pena notare che &> è specifico per bash . In zsh questo si comporta allo stesso modo, ma secondo la documentazione, "... non ha il stesso effetto di "& gt; parola 2 & gt; & amp; 1" in presenza di più ". In /bin/sh conforme a POSIX, questo sarebbe trattato come un reindirizzamento regolare con l'inserimento di un comando in background. Vedi anche, C'è qualche codice sh che non sia un codice bash sintatticamente valido? .

    
risposta data Sergiy Kolodyazhnyy 03.05.2018 - 20:02
fonte

Leggi altre domande sui tag