2011-01-19 23 views
11

Existen varios comandos de Unix que están diseñados para operar en dos archivos. Comúnmente, dichos comandos permiten que los contenidos de uno de los "archivos" se lean desde la entrada estándar utilizando un solo guión en lugar del nombre del archivo.Redirigir dos archivos a la entrada estándar

me encontré con a technique que parece permitir que ambos archivos sean leídos de la entrada estándar:.

comm -12 <(sort file1) <(sort file2) 

Mi reacción inicial fue de incredulidad, "Eso debería no funciona de entrada estándar solo tendrá la concatenación de Ambos archivos. El comando no podrá distinguir los archivos ni siquiera darse cuenta de que se le ha dado el contenido de dos archivos ".

Por supuesto, esta construcción funciona. Lo he probado con comm y diff usando bash 3.2.51 en cygwin 1.7.7. Tengo curiosidad por cómo y por qué funciona:

  • ¿Por qué funciona esto?
  • ¿Es esta una extensión de Bash, o es esta funcionalidad Bourne shell recta?
  • Esto funciona en mi sistema, pero ¿funcionará esta técnica en otras plataformas? (En otras palabras, ¿los guiones escritos usando esta técnica serán portátiles?)

Respuesta

9

Bash, Korn (ksh93, de todos modos) y Z desembolsar todo el apoyo process substitution. Estos aparecen como archivos para la utilidad. Pruebe esto:

$ bash -c 'echo <(echo)' 
/dev/fd/63 
$ ksh -c 'echo <(echo)' 
/dev/fd/4 
$ zsh -c 'echo <(echo)' 
/proc/self/fd/12 

Aparecerán descriptores de archivos similares a los que se muestran.

+0

Eso es todo - ¡sustitución de procesos! Pasé mucho tiempo buscando información en redireccionamiento, pero tenía el nombre equivocado. –

+0

Gracias. Esto ayudó. El ksh88 confirmado (en AIX 7.1) no admite este estilo de sustitución de proceso. Gracias Ganesh por bash. –

4

Esta es una extensión Bash estándar. <(sort file1) abre una tubería con la salida del comando sort file1, le da a la tubería un nombre de archivo temporal y pasa ese nombre de archivo temporal en la línea de comando comm.

Puede ver cómo funciona por conseguir echo que le diga lo que se pasa al programa:

echo <(sort file1) <(sort file2) 
Cuestiones relacionadas