Что означает "<()" в bash?
Я пытаюсь установить RVM. Существует магическая командная строка:
bash < <(curl -s https://rvm.io/install/rvm)
Я знаю, что такое bash и curl. Я знаю, что первая <
- перенаправление ввода-вывода. Но что означает синтаксис <()
?
Какая разница между этой командой и
bash < `curl -s https://rvm.io/install/rvm`
? (последняя команда не работает)
Ответы
Ответ 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)
Ответ 4
Он называется Замена процесса.