Что означает перенаправление «<<(…)»?

32

Я видел, что rvm (менеджер версий ruby) устанавливается с помощью следующей команды:

bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )

Итак, насколько я понимаю, мы получаем содержимое сценария и передаем его в bash (я верю, < <и <<это то же самое?). Я заинтересован в этой < <части, нашел следующее описание в сети:

<< токен Означает использование текущего входного потока в качестве STDIN для программы, пока токен не будет виден.

Мне это как-то непонятно, кто-то может привести пример или объяснить это более простым способом?

Stonerain
источник

Ответы:

40

Нет < <и <<не одно и то же.

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

Другими словами вы можете думать , < <(command)как < file, где файл содержит вывод command.

enzotib
источник
5
Я узнал об этой команде несколько дней назад, это очень полезная команда. Вещи, которые вы можете сделать с этим, ограничены только вашим воображением: например, эта команда предоставляет вам список только скрытых файлов:diff <(ls) <(ls -a)
Хаджа Минхаджуддин
1
Этот синтаксис действительно может быть весьма полезным, но в конкретном случае Стоунрейна он, по-видимому, не дает никакой дополнительной выгоды по сравнению с простым каналом.
Jlliagre
1
В приведенном выше синтаксисе это не помогает. Но если вы немного измените его, это будет намного лучше: bash <(curl ...)вместо того, bash < <(curl ...)чтобы не красть STDIN, вы можете отвечать на запросы и вводить данные в сценарий.
Tylerl
Использование <() кажется отличной альтернативой для отправки нескольких переменных $ напрямую в команды, вместо того, чтобы сначала без необходимости записывать $ переменные в файлы. diff <(echo "$ text1") <(echo "$ text2") stackoverflow.com/questions/13437104/…
Sepero
18

Это запутанный способ сделать проще:

curl -s https://raw.github.com/... | bash
jlliagre
источник