2009-08-19 22 views
11

En a post's respuesta en superuser.com, vemos que¿Qué hace <() en Bash?

join <(sort abc) <(sort bcd) 

clasificará archivos ABC y BCD antes de enviarlos a unirse. Esto lleva a una pregunta de programación, más adecuada para stackoverflow.

¿Cómo funciona esto? ¿Qué es exactamente esta construcción <()? ¿Cómo se llama?

Si (ordenar abc) es una llamada legal que se ejecuta ordenar en abc y devuelve resultados, ¿por qué necesitamos el <?

Es decir, las dos líneas siguientes son equivalentes

(sort abc) | join - <(sort bcd) 
join <(sort abc) <(sort bcd) 

pero

join (sort abc) (sort bcd) 

es un error de sintaxis. Por favor, ¡dame una pista!

+1

¿Qué ha sido de la buena tradición de leer el buen manual de un caparazón? – Jens

Respuesta

21

Esto se denomina sustitución de procesos.

<(list) es un único constructo de sintaxis, la '<' carácter no es un símbolo separado en este caso. Ejecuta la lista y proporciona su salida como una especie de archivo (no como una redirección estándar) al comando.

Es equivalente a ejecutar (excepto que utiliza tubos en lugar de archivos temporales cuando sea posible):

sort abc > /tmp/1 
sort bcd > /tmp/2 
join /tmp/1 /tmp/2 

Tenga en cuenta que la salida de ambos tipos se proporcionan como nombres de archivo a unirse, redirecciones no como estándar.

(list) es una construcción diferente, para un propósito diferente. Simplemente crea una subshell que ejecuta lista, proporcionando sus descriptores estándar al shell primario.

Here es la parte relevante en el manual de bash.

5

<(command) es una sustitución Proceso (ver la sección de acuerdo en man bash). Básicamente comando se ejecuta y su salida se alimenta a una tubería con nombre (FIFO), y luego se sustituye todo el constructo con el nombre de la tubería, lo que resulta en join /dev/fd/x /dev/fd/y.