Как работает команда для установки RVM?

Вопрос новичка. Я устанавливал RVM (инструмент для управления версиями Ruby ). Команда для него:

bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )

Я немного знаю, что < является оператором перенаправления команд (верно?).

Тогда зачем нужен второй < (для чего он нужен)?

2
задан 25 November 2010 в 12:25

2 ответа

Превращает строку в дескриптор файла для выходных данных сценария bash, который он представляет. Это может сбивать с толку, вот пример

, если вы введете echo <(ls), откроется новый файловый дескриптор, имя которого подставляется. Таким образом, команда может превратиться в слово echo /dev/fd/63.

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

$ my_program ls
Error: 'ls': No such file or directory.
$ my_program <(ls)
my_program was called with the argument /dev/fd/63
bin dev etc ...

Многие программы Linux, если они не снабжены источником ввода, будут ожидать стандартного ввода. Поскольку стандартный вывод может быть передан на стандартный ввод с помощью оператора «|», вы можете использовать команду say ls | grep hello. Это работает только потому, что grep ожидал бы ввода данных в любом случае, если бы он ожидал, что имя файла будет открыто и прочитано для получения его данных, оператор pipe не работает. Вот почему вам нужно < (...).

1117 Надеюсь, это понятно. : -)

Вместе с < оператор для перенаправления вывода файла в программы, читающие stdin, это делает для следующего значения :

Bash: читать выходные данные из этого файла, который создается из выходных данных эта команда.

Пояснения:

  • стандартный ввод: «файл» (не совсем, но в linux все действует как файл), который при чтении волшебным образом содержит то, что вы ввели
  • [ 1111] стандартный вывод: «файл», который при записи будет распечатан на оператор виртуального терминала
  • (т. Е. < или <()): То же, что и в обычных математических выражениях, выражениях операторов и операнды будут оценены и заменены. 3 + 2 * 3 превращается в 5 * 3 превращается в 15. То же самое в языке bash.

Хорошим примером, подчеркивающим точку зрения Роджера, является следующее выражение:

if [ -f my_condition ] then something fi

Здесь содержимое скобок будет оцениваться как условный оператор, то есть, если my_condition - true, тогда сделать что-то. Но: [ на самом деле является просто псевдонимом программы test, которая при вызове с параметром -f проверит, существует ли файл.

0
ответ дан 25 November 2010 в 12:25

Для прояснения мысли Stefano второе <не просто <это на самом деле <()

Можно уже быть знакомы с подобной конструкцией, $ (), который производит строку, которая является результатом команды в нем. Так:

$ which bash # echo the path to bash
/bin/bash
$ ldd $(which bash) # return which libraries bash is linked to
...

После строковой замены это эквивалентно

ldd /bin/bash

Как Stefano говорит, <() делает очень похожую вещь, но вместо этого возвращает дескриптор файла.

Можно найти документацию удара в man bash. Поскольку это - огромная страница справочника, можно искать (нажатие /) для <\( (необходимо выйти из открытой скобки - поиск <( не будет работать).

2
ответ дан 25 November 2010 в 12:25

Другие вопросы по тегам:

Похожие вопросы: