Вопрос новичка. Я устанавливал RVM (инструмент для управления версиями Ruby ). Команда для него:
bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )
Я немного знаю, что <
является оператором перенаправления команд (верно?).
Тогда зачем нужен второй <
(для чего он нужен)?
Превращает строку в дескриптор файла для выходных данных сценария 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 не работает. Вот почему вам нужно < (...).
Вместе с < оператор для перенаправления вывода файла в программы, читающие stdin, это делает для следующего значения :
Bash: читать выходные данные из этого файла, который создается из выходных данных эта команда.
Пояснения:
<
или <()
): То же, что и в обычных математических выражениях, выражениях операторов и операнды будут оценены и заменены. 3 + 2 * 3 превращается в 5 * 3 превращается в 15. То же самое в языке bash. Хорошим примером, подчеркивающим точку зрения Роджера, является следующее выражение:
if [ -f my_condition ] then something fi
Здесь содержимое скобок будет оцениваться как условный оператор, то есть, если my_condition - true, тогда сделать что-то. Но: [
на самом деле является просто псевдонимом программы test
, которая при вызове с параметром -f проверит, существует ли файл.
Для прояснения мысли 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
. Поскольку это - огромная страница справочника, можно искать (нажатие /
) для <\(
(необходимо выйти из открытой скобки - поиск <(
не будет работать).