É chamado de substituição de processo e é um recurso do bash, zsh e ksh (e possivelmente outros, não sei). Não é POSIX e você não deve usá-lo em código portátil, mas é muito útil.
Aqui está a seção relevante do manual do bash:
3.5.6 Substituição de processo
A substituição de processo é suportada em sistemas que suportam pipes nomeados (FIFOs) ou o método / dev / fd para nomear arquivos abertos. Toma a forma de
<(list)
ou
>(list)
A lista de processos é executada com sua entrada ou saída conectada a um FIFO ou a algum arquivo em / dev / fd. O nome desse arquivo é passado como argumento para o comando atual como resultado da expansão. Se o formulário> (lista) for usado, a gravação no arquivo fornecerá entrada para a lista. Se o formulário <(lista) for usado, o arquivo passado como argumento deve ser lido para obter a saída da lista. Observe que nenhum espaço pode aparecer entre <ou> e o parêntese esquerdo, caso contrário, a construção seria interpretada como um redirecionamento.
Quando disponível, a substituição do processo é realizada simultaneamente com a expansão de parâmetro e variável, substituição de comando e expansão aritmética.
git diff --no-index file1 <(cat file2)
falhará com:error: /dev/fd/63: unsupported file type
. Você também pode vererror: readlink("/dev/fd/63"): No such file or directory
se a implementação cria um link simbólico para o canal (aparece como um link quebrado por algum motivo).