Це називається процес заміщення і є особливістю bash, zsh і ksh (і, можливо, інших, я не знаю). Це не POSIX, і ви не повинні використовувати його в портативному коді, але це дуже корисно.
Ось відповідний розділ посібника з bash:
3.5.6 Заміна процесу
Заміна процесів підтримується в системах, які підтримують названі канали (FIFO) або метод / dev / fd іменування відкритих файлів. Він приймає форму
<(list)
або
>(list)
Список процесів виконується з його входом або виходом, підключеним до FIFO або деяким файлом в / dev / fd. Ім'я цього файлу передається як аргумент поточній команді в результаті розширення. Якщо використовується форма> (список), запис у файл надасть введення для списку. Якщо використовується форма <(list), файл, переданий як аргумент, слід прочитати, щоб отримати вихід списку. Зауважте, що між <або> та лівою дужкою не може з’явитися пробілу, інакше конструкція буде інтерпретуватися як перенаправлення.
За наявності, підміна процесу виконується одночасно з розширенням параметрів і змінних, підстановкою команд та арифметичним розширенням.
git diff --no-index file1 <(cat file2)
потерпить невдачу з:error: /dev/fd/63: unsupported file type
. Ви також можете побачити,error: readlink("/dev/fd/63"): No such file or directory
чи реалізація створює символьне посилання на трубу (чомусь для мене з'являється як розривне посилання).