2010-08-26 10 views
6

Quiero sacar el estándar de un proceso y analizarlo con tres programas diferentes. Pude usar pipes con nombre, pero puedo usar fd's en su lugar.Cómo utilizar tee en fd's en lugar de tuberías con nombre

Esto es lo que funciona hasta el momento:

 

exec 3< <(myprog) 
tee p1 p2 >/dev/null <&3 

cat p1|ap1 & 
cat p2|ap2 & 
 

p1 y p2 se han creado con mkfifo. ap1 y ap2 son programas de análisis. No sé si estoy diciendo esto bien, ¿pero hay una manera de tee en dos nuevos fd en su lugar? Algo como esto:

 

exec 3< <(myprog) 
tee >&4 >&5 <&3 

cat <&4|ap1 & 
cat <&5|ap2 & 
 

Respuesta

5

Casi lo tenía:

myprog | tee >(ap1) >(ap2) >(ap3) >/dev/null 

Tenga en cuenta que ap1 puede ser una función. Si desea que la función tenga acceso a la argumentación de la secuencia de comandos, lo llaman con "[email protected]", es decir,

ap1() { 
    # here the script arguments are available as $1, $2, ... 
} 
# ditto for ap2, ap3 
myprog | tee >(ap1 "[email protected]") >(ap2 "[email protected]") >(ap3 "[email protected]") >/dev/null 

Si su cáscara no soporta >() (bash, ksh y zsh hacer, pero no es POSIX), pero su sistema operativo, sin embargo, es compatible con /dev/fd (la mayoría de los equipos lo hacen, incluidos Solaris, Linux, * BSD, OSX y Cygwin), puede utilizar la combinación explícita de fd.

{ { { myprog | tee /dev/fd/3 /dev/fd/4 | 
     ap1 >&2 
    } 3>&1 | 
    ap2 >&2 
    } 4>&1 | 
    ap3 >&2 
} 
+0

Ahh. Eso puede funcionar Sin embargo, ¿hay alguna manera de llegar a la FD? ap1 y ap2 son enormes comandos con pipelines y toneladas de switches. Será más fácil de leer si puedo usar un fd. – User1

+0

@ User1: definitivamente es posible (y tiene la ventaja de funcionar en shells que no son compatibles con '<()' and '>()'), pero la sintaxis es incómoda. Aquí sería más simple definir 'ap1' y' ap2' como funciones. – Gilles

+0

¿Cuál es la otra sintaxis? Acabo de notar que uso sentencias if en algunas partes del script que modifican cómo se llama a ap1 de acuerdo con los parámetros de entrada. '>()' probablemente no funcionará demasiado bien en mi caso. Pero no sé cómo más puedo llamarlo. ¿Algunas ideas? Gracias por su ayuda hasta ahora. – User1

Cuestiones relacionadas