De esta publicación commandlinefu :
$ diff <(wget -q -O - URL1) <(wget -q -O - URL2)
Parece que hay múltiples entradas estándar, pero --- si recuerdo mi curso de programación de Linux correctamente --- esto no puede ser. Pensé que, por definición, la entrada estándar era una secuencia.
Tal vez esto tiene mucho que ver con stdin? ¿Alguien puede explicarme esto? tal vez proporcione enlaces a la documentación.
Bonificación: ¿Cómo manejaría un script estas múltiples transmisiones? Si alguien pudiera proporcionar un ejemplo de Python o Perl, sería muy útil.
<(…)
; en el proceso Zsh la sintaxis de sustitución es=(…)
.Respuestas:
Esto no es entrada estándar múltiple. Este es un bashismo que se llama 'Proceso de sustitución' http://tldp.org/LDP/abs/html/process-sub.html
Crea un pseudo archivo (
/dev/fd/something
) para cada sustitución. Es bastante útil El comando solo puede leerse como una secuencia, lo que significa que no puede ir y venir con fseek. Necesita leerlo como una secuencia de bytes, como una tubería.BONUS Respuesta
No necesita hacer demasiado para usar esto. En lo que respecta a su script, obtiene un nombre de archivo válido en la línea de comando, que se puede abrir () ed como cualquier otra cosa. Como otros han dicho, ya verías
diff /dev/fd/XX /dev/fd/YY
. Si hace una estadística () en cualquiera de estos pseudo-archivos, verá que es una tubería con nombre, y debe tratarla con una semántica de tubería, es decir, sin fseek () o ftell (). Si hace una prueba stat () para ver explícitamente si se trata de un archivo (por ejemplo[ -f $1 ]
), esto se romperá; después de todo, esto se implementa como una canalización con nombre.fuente
<(...)
hace substitución proceso en bash. La salida del proceso en los padres se envía a un descriptor de archivo adicional más allá de los 3 normales, y se devuelve un nombre de archivo correspondiente a ese descriptor de archivo. De esta manera, la salida de un comando puede tratarse como un nombre de archivo para pasar a otro comando.fuente
Hay uno
stdin
y unostdout
para cada proceso . Por lo general, están conectados al terminal, pero se pueden redirigir por separado uno del otro.En el ejemplo, hay dos
wget
procesos involucrados, cada uno de los cuales tiene su propiostdin
ystdout
. Cadawget
proceso escribe-
, que es sustdout
. Luegobash
, la sustitución del proceso<(...)
conecta elstdout
proceso a un pseudo-archivo único, desde el cualdiff
puede leer. ¡Tenga en cuenta que las dos sustituciones de proceso producen dos pseudo-archivos diferentes! Por lo tanto,diff
ve algo como:donde el
stdout
dewget -q -O - URL1
está conectado/dev/fd/XX
y elstdout
dewget -q -O - URL2
a/dev/fd/YY
.fuente