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

Obtengo la tercera línea donde se cierra fd 3.Ayúdame a entender esta simple redirección io en bash de la guía de ABS

Dudas: La primera línea redirige fd 3 a stdout, globally ... ¿verdad?
Preguntas: ¿Qué está pasando en la 2da línea? Proporcione una explicación detallada si es posible.

+1

Aunque se pueden hacer trucos complicados con descripciones adicionales en * sh, si esto se debe hacer al pobre schlub que tiene que leerlo a continuación (por ejemplo, usted) es menos cierto. – msw

+0

@msw Estaba mirando tu perfil y parece que tienes muy buen conocimiento sobre el shell de Linux/UNIX, etc. Te respeto por eso, pero no aprecio que me llames un schlub. Si no puede ayudar, por favor guarde sus chistes para usted. – abc

+1

También soy el pobre alumno que a menudo tiene que volver a leer mi propio código en una fecha posterior. Lamento que hayas tomado mi comentario personalmente, ya que era genérico, tenía la intención de ser algo autodestructivo, y sin duda ** no ** tenía la intención de insultar. Gran parte de mi perfil es ficción, aparte de que yo soy demasiado tiempo. – msw

Respuesta

2

Este es probablemente el mejor Redirection Tutorial que he encontrado. Cada vez que veo que se está produciendo una redirección funky, me refiero a esto para ayudarme a superarlo.

+0

Artículo muy informativo !! Leí el tutorial e hice el análisis. Esto es lo que obtuve: para ls: 0 a la terminal, 1 a la terminal, 2 a la tubería. Para grep: 0 a la tubería, 1 a la terminal, 2 a la terminal. Correcto ? – abc

3

Las redirecciones son un comando externo procesado al comando interno, y dentro de un comando de izquierda a derecha. Por lo tanto, ls -l 2>&1 >&3 3>&- inicialmente se estira al tubo. Luego, stderr se redirige a la tubería, stdout se convierte en la salida estándar (sin conexión) y la fd adicional se cierra. Por lo tanto, la salida regular de ls -l permanece sin cambios, las líneas de salida de error que contienen "malas" se envían a stdout y el resto de la salida de error se descarta.

+1

Gracias pero: ¿Cómo ahorra 'exec 3> & 1' el valor actual de stdout? 1ra línea asigna fd 3 a fd 1 y luego en la segunda línea fd 1 se asigna a fd 3? Qué significa eso ? No lo entiendo ¿por qué cerrar fd 3 dos veces en segunda línea? – abc

+1

fd 3 se cierra dos veces porque cada uno de los dos procesos nuevos tiene su propia copia – jilles

+0

Leí el tutorial y realicé el análisis. Esto es lo que obtuve: para ls: 0 a la terminal, 1 a la terminal, 2 a la tubería. Para grep: 0 a la tubería, 1 a la terminal, 2 a la terminal. Correcto ? – abc

Cuestiones relacionadas