Что делает <() в Bash?

В ответе на superuser.com мы видим, что

join <(sort abc) <(sort bcd)

будет сортировать файлы abc и bcd перед отправкой их для соединения. Это приводит к программированию, более подходящему для stackoverflow.

Как это работает? Что это за конструкция &lt (()? Как это называется?

Если (sort abc) является юридическим вызовом, который выполняет сортировку по abc и возвращает результат, зачем нам нужен <?

То есть следующие две строки эквивалентны

(sort abc) | join - <(sort bcd)
join <(sort abc) <(sort bcd)

но

join (sort abc) (sort bcd)

является синтаксической ошибкой. Пожалуйста, подскажите мне!

Ответ 1

Это называется заменой процесса.

<( list ) представляет собой единую конструкцию синтаксиса, '<' символ в этом случае не является отдельным символом. Он выполняет список и предоставляет свой вывод как своего рода файл (не стандартное перенаправление) для команды.

Он эквивалентен запуску (за исключением того, что он использует каналы вместо временных файлов, когда это возможно):

sort abc > /tmp/1
sort bcd > /tmp/2
join /tmp/1 /tmp/2

Обратите внимание, что вывод обоих типов предоставляется как имена файлов для соединения, а не как стандартные перенаправления.

( list ) - это другая конструкция для другой цели. Он просто создает подоболочку, которая выполняет список, предоставляя стандартные дескрипторы родительской оболочки.

Здесь является важной частью руководства bash.

Ответ 2

<( command ) - это Замена процесса (см. соответствующий раздел в man bash). В основном команда запускается, и ее выход подается в именованный канал (FIFO), и вся конструкция затем заменяется именем канала, что приводит к join /dev/fd/ x  /dev/fd/ y.