2011-12-23 9 views
6

¿Cuál es el constructo en bash llamado donde puede tomar un comando envolvente que se envía a stdout, de modo que el resultado en sí se trata como una secuencia? En caso de que no describa eso tan bien, tal vez un ejemplo lo haga mejor, y esto es lo que normalmente lo uso para: aplicar diff a la salida que hace no proceden de un archivo, pero de otros comandos, donde¿Cómo se llama este constructo Bash (y/o otro shell?)?

cmd 

se envuelve como

<(cmd) 

envolviendo un comando de tal manera, en el ejemplo siguiente determino que existe una diferencia de uno entre los dos comandos que estoy corriendo, y luego soy capaz para determinar esa diferencia precisa. ¿Cuál es la construcción/técnica de envolver un comando como se llama < (cmd)? Gracias

[[email protected] v6.5 html]$ git status | egrep modified | awk '{print $3}' | wc -l 
51 
[[email protected] v6.5 html]$ git status | egrep modified | awk '{print $3}' | xargs grep -l 'Ext\.define' | wc -l 
50 
[[email protected] v6.5 html]$ diff <(git status | egrep modified | awk '{print $3}') <(git status | egrep modified | awk '{print $3}' | xargs grep -l 'Ext\.define') 
39d38 
< javascript/reports/report_initiator.js 

ADENDA El comando revisada mediante el asesoramiento para el uso de ls-archivo de Git debe ser de la siguiente manera (no probado):

diff <(git ls-files -m) <(git ls-files -m | xargs grep -l 'Ext\.define') 
+5

No analice 'git status', use' git ls-files -m'! – Mat

+0

Gracias por la punta git, funcionaba como un amuleto –

+1

Se llama abominación. ;) –

Respuesta

6

Esto se llama Process Substitution

+0

Estoy aceptando la otra respuesta a pesar de ser idéntica porque ese usuario también me dio una sugerencia útil, espero que entienda, me preguntaba cómo iba a elegir entre dos respuestas simultáneas idénticas –

+0

Bueno, no del todo simultáneo, ' Le di una paliza a Mat unos 30 segundos, pero solo porque él te estaba ayudando con tu problema, no con tu pregunta. Supongo que es justo. – MattH

+0

Sí, ahora veo que finalmente tengo una pantalla que dice que respondió hace 14 minutos, y Mat 13 minutos atrás –

1

Esto es una sustitución de proceso, como le han informado. Solo me gustaría señalar que esto también funciona en la otra dirección. La sustitución de procesos con> (cmd) le permite tomar un comando que escribe en un archivo y, en su lugar, hacer que esa salida se redirija al stdin de otro comando. Es muy útil para insertar algo en una canalización que toma un nombre de archivo de salida como argumento. No lo ve tanto porque prácticamente todos los comandos estándar escribirán en stdout, pero lo he usado a menudo con material personalizado. Aquí hay un ejemplo inventado:


$ echo "hello world" | tee >(wc) 
hello world 
     1  2  12 
Cuestiones relacionadas