Esto se llama sustitución de procesos.
3.5.6 Sustitución de procesos
La sustitución de procesos permite hacer referencia a la entrada o salida de un proceso mediante un nombre de archivo.
La lista de procesos se ejecuta de forma asíncrona y su entrada o salida aparece como un nombre de archivo. Este nombre de archivo se pasa como argumento al comando actual como resultado de la expansión. Si se usa el formulario>(lista), escribir en el archivo proporcionará entrada para la lista. Si se usa la forma <(lista), el archivo pasado como argumento debe leerse para obtener la salida de lista. Tenga en cuenta que no puede aparecer ningún espacio entre
No es solo una cosa bash como apareció originalmente en ksh pero no está en el estándar posix.
Bajo el capó, la sustitución de procesos tiene dos implementaciones. En sistemas que soportan /dev/fd
(la mayoría de los sistemas similares a Unix) funciona llamando al pipe(
) llamada al sistema, que devuelve un descriptor de archivo $fd
para una nueva tubería anónima, luego crea la cadena /dev/fd/$fd
, y lo sustituye en la línea de comando. En sistemas sin /dev/fd
soporte, llama a mkfifo
con un nuevo nombre de archivo temporal para crear una canalización con nombre y sustituye este nombre de archivo en la línea de comando.
Puedes pensar en <( somecommand )
como el nombre de archivo de un archivo temporal que contiene la salida de somecommand
. En otras palabras,
utility < <( somecommand )
es un atajo para
somecommand >tempfile
utility <tempfile
rm -f tempfile
Y
utility <( somecommand )
es un atajo para
somecommand >tempfile
utility tempfile # notice the lack of redirection here (utility expected to read from "tempfile")
rm -f tempfile
Del mismo modo >( somecommand )
puede considerarse como el nombre de archivo de un archivo temporal que se introducirá en somecommand
en su entrada estándar. En otras palabras,
utility > >( somecommand )
es un atajo para
utility >tempfile
somecommand <tempfile
rm -f tempfile
Y
utility >( somecommand )
posiblemente podría ser un atajo para
mkfifo temppipe
somecommand <temppipe &
utility temppipe # utility is expected to write to "temppipe"
rm -f temppipe
(o algo similar)