Как называется синтаксис bash '<(file content)'?

25

Этот ответ на Security StackExchange использует интересный синтаксис bash для генерации файла в строке:

openssl req -new -x509 -nodes -newkey ec:<(openssl ecparam -name secp384r1) -keyout cert.key -out cert.crt -days 3650

Этот бит особенно интересен:

<(openssl ecparam -name secp384r1)

Работает только:

echo <(openssl ecparam -name secp384r1)

Я вернусь /dev/fd/63

Так что это похоже на создание временного дескриптора файла с содержимым файла.

Как это называется?

mikemaccana
источник
3
Обратите внимание, что результирующий «файл» на самом деле является именованным каналом, и некоторые программы не поддерживают их в качестве аргументов файла. Пример: git diff --no-index file1 <(cat file2)потерпит неудачу с: error: /dev/fd/63: unsupported file type. Вы также можете увидеть error: readlink("/dev/fd/63"): No such file or directory, создает ли реализация символическую ссылку на канал (почему-то для меня она выглядит как неработающая ссылка).
Кельвин

Ответы:

35

Это называется подстановка процесса и является функцией bash, zsh и ksh (и, возможно, других, я не знаю). Это не POSIX, и вы не должны использовать его в переносимом коде, но это очень полезно.

Вот соответствующий раздел руководства по bash:

3.5.6 Замена процесса

Подстановка процессов поддерживается в системах, которые поддерживают именованные каналы (FIFO) или метод / dev / fd именования открытых файлов. Это принимает форму

  <(list) 

или

  >(list) 

Список процессов запускается с его входом или выходом, подключенным к FIFO или некоторому файлу в / dev / fd. Имя этого файла передается в качестве аргумента текущей команде в результате расширения. Если используется форма> (список), запись в файл обеспечит ввод для списка. Если используется форма <(list), файл, переданный в качестве аргумента, следует прочитать, чтобы получить вывод списка. Обратите внимание, что между <или> и левой круглой скобкой не должно быть пробела, в противном случае конструкция будет интерпретирована как перенаправление.

Когда доступно, подстановка процесса выполняется одновременно с расширением параметров и переменных, подстановкой команд и арифметическим расширением.

Тердон
источник