Що означає перенаправлення “<<(…)”?


32

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

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

Отже, як я розумію, ми отримуємо вміст скрипту і передаємо його в bash (я вважаю, < <і <<це те саме?) Мене зацікавила < <частина, яка знайшла наступний опис в мережі:

<< token Значить використовувати поточний вхідний потік як STDIN для програми, поки маркер не буде показаний.

Це мені якось незрозуміло, чи може хтось зробити приклад чи пояснити це більш простим способом?

Відповіді:


40

Ні, < <і <<це не одне і те ж.

Перший складається із загального <символу перенаправлення, поєднаного з першим символом <(command)синтаксису. Це kshконструкція (також знайдена в bashі zsh), відома як заміна процесу, яка приймає результат commandі надає його у файл, ім'я якого посилається на інший кінець труби command, на яку пише.

Іншими словами ви можете думати , < <(command)як < file, де файл містить висновок command.


5
Я дізнався про цю команду кілька днів тому, це дуже корисна команда. Те, що ви можете зробити з цим, обмежується лише вашою фантазією: наприклад, ця команда дає вам список лише прихованих файлів:diff <(ls) <(ls -a)
Khaja Minhajuddin,

1
Цей синтаксис справді може бути досить корисним, але в конкретному випадку Stonerain, схоже, він не надає додаткової вартості порівняно з простою трубкою.
jlliagre

1
У наведеному вище синтаксисі це не допомагає. Але якщо це змінити трохи, це набагато краще: bash <(curl ...)замість того bash < <(curl ...), щоб не красти STDIN, ви можете відповідати на підказки та надати вхід у сценарій.
tylerl

Використання <() здається чудовою альтернативою для прямого надсилання декількох змінних $ командам, замість того, щоб спочатку писати $ змінні у файли. дифф <(відлуння "$ text1") <(відлуння "$ text2") stackoverflow.com/questions/13437104 / ...
Sepero

18

Це складний спосіб зробити простіший:

curl -s https://raw.github.com/... | bash
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.