Як називається синтаксис bash '<(вміст файлу)?


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

Таким чином, це, мабуть, робить тимчасовий дескриптор файлу зі вмістом файлу.

Як це називається?


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), файл, переданий як аргумент, слід прочитати, щоб отримати вихід списку. Зауважте, що між <або> та лівою дужкою не може з’явитися пробілу, інакше конструкція буде інтерпретуватися як перенаправлення.

За наявності, підміна процесу виконується одночасно з розширенням параметрів і змінних, підстановкою команд та арифметичним розширенням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.