Что делает <() в Bash?
В ответе на superuser.com мы видим, что
join <(sort abc) <(sort bcd)
будет сортировать файлы abc и bcd перед отправкой их для соединения. Это приводит к программированию, более подходящему для stackoverflow.
Как это работает? Что это за конструкция < (()? Как это называется?
Если (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
.