2009-08-19 3 views
11

В a post's ответе на superuser.com, мы видим, чтоЧто делает <() в Bash?

join <(sort abc) <(sort bcd) 

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

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

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

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

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

но

join (sort abc) (sort bcd) 

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

+1

Что стало с доброй старой традицией чтения прекрасного руководства для оболочки? – Jens

ответ

21

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

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

Это эквивалентно запуску (кроме него использует трубы вместо временных файлов при возможности):

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

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

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

Here - соответствующая часть в руководстве bash.

5

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

Смежные вопросы