Подтвердить что ты не робот

Что означает "<()" в bash?

Я пытаюсь установить RVM. Существует магическая командная строка:

bash < <(curl -s https://rvm.io/install/rvm)

Я знаю, что такое bash и curl. Я знаю, что первая < - перенаправление ввода-вывода. Но что означает синтаксис <()?

Какая разница между этой командой и

bash < `curl -s https://rvm.io/install/rvm`

? (последняя команда не работает)

4b9b3361

Ответ 1

Это bash замена процесса.

Выражение <(list) заменяется на имя файла, либо с именем FIFO, либо с именем /dev/fd. Поэтому для фактического перенаправления ввода из него вы должны использовать < <(list).

[править; забыл ответить на ваш второй вопрос]

Обратные ссылки называются "замена команд" . В отличие от подстановки процесса, он является частью спецификации оболочки POSIX (т.е. Не расширения bash). Оболочка запускает команду в backticks и заменяет ее вывод в командной строке. Поэтому это имеет смысл:

cat < `echo /etc/termcap`

Но это не так:

cat < `cat /etc/termcap`

Последний похож на ваш пример; он пытается использовать (сложный) вывод команды в качестве имени файла, из которого можно перенаправить стандартный ввод.

Ответ 2

Другие уже ответили на ваш вопрос очень красиво. Я просто добавлю пример, чтобы построить на них... 99% времени, когда я лично использовал <(), он должен различать вывод двух разных команд за один снимок. Например,

diff <( some_command ) <( some_other_command )

Ответ 3

Синтаксис для перенаправления io -

process < file

Следовательно, вам нужно что-либо, появившееся после перенаправления io, как имя файла.

Расширение backtick буквально помещает результаты команды в командную строку. Таким образом,

 `curl -s https://rvm.io/install/rvm`

расширяется до чего-то вроде    #!/usr/bin/env bash...

и оболочка будет запутана, потому что она увидит

 bash < #... 

вместо имени файла.

Оператор <() - это замещение процесса, которое запускает новый процесс для запуска команды внутри (..). Создается новый файл или труба, которые будут фиксировать результат. Тот факт, что стрелка указывает слева <() вместо >(), означает, что вывод из внутреннего процесса будет записан в файл, который может быть прочитан процессом.

В вашем случае bash < <(...) будет рассматриваться как нечто вроде bash < /dev/fd/100

Если вы действительно хотите увидеть, что происходит, запустите

echo <(curl -s https://rvm.io/install/rvm)