Se llama sustitución de proceso y es una característica de bash, zsh y ksh (y posiblemente otros, no lo sé). No es POSIX y no debe usarlo en código portátil, pero es muy útil.
Aquí está la sección relevante del manual de bash:
3.5.6 Sustitución del proceso
La sustitución de procesos es compatible con sistemas que admiten canalizaciones con nombre (FIFO) o el método / dev / fd para nombrar archivos abiertos. Toma la forma de
<(list)
o
>(list)
La lista de procesos se ejecuta con su entrada o salida conectada a un FIFO o algún archivo en / dev / fd. El nombre de este 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á información para la lista. Si se usa la forma <(lista), el archivo pasado como argumento debe leerse para obtener el resultado de la lista. Tenga en cuenta que no puede aparecer espacio entre el <o> y el paréntesis izquierdo, de lo contrario la construcción se interpretaría como una redirección.
Cuando está disponible, la sustitución del proceso se realiza simultáneamente con la expansión de parámetros y variables, la sustitución de comandos y la expansión aritmética.
git diff --no-index file1 <(cat file2)
fallará con:error: /dev/fd/63: unsupported file type
. También puede vererror: readlink("/dev/fd/63"): No such file or directory
si la implementación crea un enlace simbólico a la tubería (aparece como un enlace roto por alguna razón).