Ich kann dieses Skript nicht verstehen. bash << (curl -s http://xxx.com)

7

In einem Rails-Buch schrieb der Autor das Skript zur Installation von Ruby RVM.

bash <<(curl -s https://rvm.beginrescueend.com/install/rvm)

Aber ich verstehe nicht, wie es funktioniert. Könnten Sie das erklären?

Benjamin
quelle
6
Nebenbei bemerkt ist das Einfügen von Befehlen, die nicht vertrauenswürdige Skripte aus dem Internet herunterladen und dann ausführen, eine schlechte Praxis.
donothings erfolgreich
2
@donothingsuccessfully Das war auch mein erster Gedanke. Ich frage mich, ob der Autor über die Auswirkungen auf die Sicherheit geschrieben hat, z. B. ob beginrescueend.com in etwa 10 Jahren in die Hand eines Domain-Grabbers fällt. Er sollte haben.
Residuum

Antworten:

11

Es gibt einen << -Operator (hier Dokument), der hier jedoch nicht verwendet wird.

Sie haben zuerst eine Eingabeumleitung, <die besagt, dass Sie die Eingabe aus dem folgenden Argument auswählen müssen. Dann gibt es die <(command)so genannte Prozessersetzung, die besagt, dass diese durch einen Dateideskriptor ersetzt wird, der die Ausgabe des Befehls enthält.

Dieser Befehl könnte geschrieben worden sein

bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)

aber ist nur eine verschlungene Art zu tun:

curl -s https://rvm.beginrescueend.com/install/rvm | bash
jlliagre
quelle
4

one <<(two)führt den Befehl aus twound leitet seine Ausgabe an weiter one. Die gebräuchlichere Schreibweise ist two | one, sodass Ihr Befehl auch geschrieben werden kann:

curl -s https://rvm.beginrescueend.com/install/rvm | bash

Dieser Link ist jetzt defekt, aber die Website sagt , dass stattdessen dieser verwendet werden soll:

curl -L get.rvm.io | bash -s stable

curlgibt aus, was heruntergeladen wird, daher wird die Datei unter heruntergeladen get.rvm.iound der Inhalt an bash weitergeleitet. Wenn Sie den curlBefehl nur selbst ausführen, sehen Sie, dass es sich um ein bashSkript handelt, das rvm herunterlädt und installiert

Michael Mrozek
quelle
Die Verwendung von Rohren |ist mir vertrauter. Warum benutzte er die seltsame Syntax? Ist das ein Trend?
Benjamin
Eine Sache noch. Wie spricht man den Operator << aus? Wird es auch genannt pipe?
Benjamin
3
@Benjamin <<ist der Dokumentoperator hier . foo < <(bar)ist meist gleichwertig bar | foomit hauptsächlich,:, aber mit einigen Unterschieden , die hier keine Rolle zu tun < <(…), fooführt eine in der Haupt - Shell - Umgebung, und wenn der Befehl foozurückkehrt, während bei einem Rohr, fooführt eine in einer Subshell und die Pipeline wartet sowohl Befehle zu vervollständigen. (Das ist in Bash, das Verhalten ist in ksh und zsh näher.)
Gilles 'SO - hör auf böse zu sein'
@ Gilles. Beeindruckend. unerwarteter Kommentar. das ist ein guter Punkt. Vielen Dank.
Benjamin