2010-11-21 10 views
6
exec 3>&1       # Save current "value" of stdout. 
ls -l 2>&1 >&3 3>&- | grep bad 3>&- # Close fd 3 for 'grep' (but not 'ls'). 
#    ^^^^ ^^^^ 
exec 3>&-       # Now close it for the remainder of the script. 

Ottengo la 3a riga dove viene chiuso fd 3.Aiutami a capire questo semplice reindirizzamento in bash dalla guida ABS

Dubbi: 1a riga reindirizza da fd 3 a stdout, globalmente ... giusto?
Domande: Cosa succede sulla seconda linea? Si prega di fornire una spiegazione dettagliata se possibile.

+1

Anche se uno può eseguire trucchi complicati con descrittori aggiuntivi in ​​* sh, se questo dovrebbe essere fatto al povero schlub che deve leggerlo dopo (ad es. Tu) è meno sicuro. – msw

+0

@msw Stavo guardando il tuo profilo e sembra che tu abbia una buona conoscenza della shell Linux/UNIX, ecc. Ti rispetto per questo, ma non apprezzo che tu mi abbia chiamato schlub. Se non puoi aiutare, tieni le tue battute per te. – abc

+1

Sono anche il povero schlub che spesso deve rileggere il mio codice in un secondo momento. Mi dispiace che tu abbia accettato personalmente il mio commento, in quanto generico, con l'intento di essere un po 'autoironico, e sicuramente ** non ** destinato a insultare. Gran parte del mio profilo è finzione, a parte il fatto che sono in giro troppo a lungo. – msw

risposta

2

Questo è probabilmente il migliore Redirection Tutorial che ho trovato. Ogni volta che vedo alcuni reindirizzamenti funky in corso, mi riferisco a questo per aiutarmi attraverso di esso.

+0

Articolo molto informativo !! Ho letto il tutorial e ho fatto l'analisi. Ecco cosa ho ottenuto: Per ls: 0 al terminale, 1 al terminale, 2 al pipe. Per grep: 0 per pipe, 1 per terminale, 2 per terminale. Destra ? – abc

3

I reindirizzamenti vengono elaborati dal comando esterno al comando interno e all'interno di un comando da sinistra a destra. Pertanto, ls -l 2>&1 >&3 3>&- inizialmente ottiene stdout alla pipe. Quindi, stderr viene reindirizzato alla pipe, lo stdout diventa lo stdout originale (unpiped) e il fd extra viene chiuso. Pertanto, l'output regolare di ls -l rimane invariato, le righe dell'output di errore che contengono "bad" vengono inviate allo stdout e il resto dell'output di errore viene eliminato.

+1

Grazie, ma: In che modo questo 'exec 3> & 1' salva il valore corrente di stdout? La prima riga assegna da fd 3 a fd 1 e poi nella seconda riga fd 1 è assegnata a fd 3? Cosa significa ? Non capisco perché chiudere fd 3 due volte in seconda linea? – abc

+1

fd 3 viene chiuso due volte perché ciascuno dei due nuovi processi ha la sua copia – jilles

+0

Ho letto il tutorial e fatto l'analisi. Ecco cosa ho ottenuto: Per ls: 0 al terminale, 1 al terminale, 2 al pipe. Per grep: 0 per pipe, 1 per terminale, 2 per terminale. Destra ? – abc

Problemi correlati