2012-10-01 35 views
6

Cuando trato de referirme a dos tuberías de sustitución de procesos en una función bash, solo funciona la primera referencia. El segundo da un error de "mala descriptor de archivo" de este modo:La sustitución de doble proceso de Bash da un mal descriptor de archivo

$ foo(){ 
> cat "$1" 
> cat "$2" 
> } 
$ foo <(echo hi) <(echo bye) 
hi 
cat: /dev/fd/62: Bad file descriptor 
$ 

Parece que el segundo tubo se deja caer una vez que uno se hace referencia, pero a) Me parece que no puede confirmar este comportamiento en cualquier documentación y b) Desearía que no fuera así. =)

¿Alguna idea sobre lo que estoy haciendo mal? FWIW Estoy haciendo esto para hacer un contenedor para usar la herramienta gráfica diff de FileMerge de Mac OS X en lugar de la línea de comando uno, que ya está feliz de trabajar con varias tuberías desde la línea de comandos.

-Rob

Respuesta

2

¿Seguro que está ejecutando con bash y no alguna otra concha? ¿Ha comprobado el resultado de echo $SHELL?

me da buenos resultados usando bash:!

[16:03:51][[email protected](1)]:~ 
(0)$function foo() { cat "$1"; cat "$2"; }; 
[16:03:59][[email protected](1)]:~ 
(0)$foo <(echo "lva") <(echo hi) 
lva 
hi 

Cuando cambio el tinglado a #/bin/tablero, por ejemplo, se producen errores.

Por favor intenta poner #!/Bin/bash como un shebang en la primera línea de tu script.

+0

Eso no es una respuesta ... Acabo de comprobar: funciona en Linux y falla en osx, que parece ser la plataforma del OP. –

4

El /bin/bash suministrado con OSX (3.2.48) falla en eso. El de macports (4.2.37 - normalmente /opt/local/bin/bash si lo tiene instalado) funciona bien. Si es versión o compilación no lo sé. Quizás desee usar macports bash para este script. Uno ciertamente tiene que tener macports en cada mac, así que supongo que lo haces ;-)

+0

Sí, macports bash lo arregló para mí. Actualizaré mi inicio de sesión de terminal. ¡Gracias! – rharder

5

Primero, creo que @Michael Krelin tiene razón al decir que esto está relacionado con la versión de bash suministrada con OS X (v3.2.48). Se ve desde mi prueba como si los descriptores de fichero consiguen descartados después del primer comando externo de la función ejecuta:

$ bar() { echo "Args: $*"; echo "First ext command:"; ls /dev/fd; echo "Second ext command:"; ls /dev/fd; } 
$ bar <(echo hi) <(echo bye) 
Args: /dev/fd/63 /dev/fd/62 
First ext command: 
0 1 2 3 4 5 6 62 63 
Second ext command: 
0 1 2 3 4 5 6 

Tenga en cuenta que/dev/fd/62 y 63 desaparecen entre los dos ls listados. Creo que he encontrado una solución, sin embargo: copiar los frágiles del fd que no frágiles de fd antes de que tengan la oportunidad de desaparecer:

$ baz() { exec 3<"$1" 4<"$2"; ls /dev/fd; ls /dev/fd; cat /dev/fd/3; cat /dev/fd/4; } 
$ baz <(echo hi) <(echo bye) 
0 1 2 3 4 5 6 62 63 
0 1 2 3 4 5 6 
hi 
bye 
+0

solución asombrosa. Sí, lo siento no haber especificado, pero el comportamiento extraño estaba en OS X 10.8. Me di cuenta de que este comportamiento extraño tampoco ocurría en cygwin. Probablemente cambie a macports bash, si eso funciona "bien". – rharder

+0

+1 para solución alternativa. Totalmente poco práctico, pero genial ;-) –

Cuestiones relacionadas