2010-11-21 16 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. 

Je reçois la troisième ligne où fd 3 est en cours de fermeture.Aidez-moi à comprendre cette simple redirection io dans bash du guide ABS

Doutes: 1ère ligne redirige fd 3 vers stdout, globalement ... non?
Questions: Que se passe-t-il sur la deuxième ligne? S'il vous plaît fournir une explication verbeuse si possible.

+1

Bien que l'on puisse faire des astuces compliquées avec des descripteurs supplémentaires dans * sh, il est moins certain que cela soit fait au pauvre schlub qui doit le lire ensuite (par exemple vous). – msw

+0

@msw Je regardais votre profil et vous semblez avoir une très bonne connaissance du shell Linux/UNIX etc. Je vous respecte pour cela, mais je n'apprécie pas que vous m'appeliez un schlub. Si vous ne pouvez pas aider, s'il vous plaît gardez vos Wisecracks pour vous. – abc

+1

Je suis aussi le pauvre schlub qui doit souvent relire mon propre code à une date ultérieure. Je suis désolé que vous ayez pris mon commentaire personnellement, car il était générique, destiné à être quelque peu autodestructeur, et certainement pas ** destiné à insulter. Une grande partie de mon profil est de la fiction, en dehors de moi étant trop longtemps. – msw

Répondre

2

C'est probablement le meilleur Redirection Tutorial que j'ai trouvé. Chaque fois que je vois une redirection funky se passe, je me réfère à cela pour m'aider à travers cela.

+0

Article très informatif !! J'ai lu le tutoriel et fait l'analyse. Voici ce que j'ai obtenu: Pour ls: 0 à la borne, 1 à la borne, 2 à la tuyauterie. Pour grep: 0 à canaliser, 1 à terminal, 2 à terminal. Droite ? – abc

3

Les redirections sont traitées à l'aide de la commande externe à la commande interne et dans une commande de gauche à droite. Par conséquent, ls -l 2>&1 >&3 3>&- obtient initialement stdout à la conduite. Ensuite, stderr est redirigé vers le tube, stdout devient le stdout d'origine (non pipé) et le fd supplémentaire est fermé. Donc la sortie régulière de ls -l reste inchangée, les lignes de la sortie d'erreur qui contiennent "mauvais" sont envoyées à stdout et le reste de la sortie d'erreur est rejeté.

+1

Merci mais: Comment 'exec 3> & 1' sauve-t-il la valeur actuelle de stdout? La 1ère ligne affecte fd 3 à fd 1, puis dans la deuxième ligne fd 1 est affecté à fd 3? Qu'est-ce que ça veut dire ? Je ne comprends pas. pourquoi fermer fd 3 deux fois en deuxième ligne? – abc

+1

fd 3 est fermé deux fois parce que chacun des deux nouveaux processus a sa propre copie – jilles

+0

J'ai lu le tutoriel et fait l'analyse. Voici ce que j'ai obtenu: Pour ls: 0 à la borne, 1 à la borne, 2 à la tuyauterie. Pour grep: 0 à canaliser, 1 à terminal, 2 à terminal. Droite ? – abc