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?
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?
Antworten:
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
one <<(two)
führt den Befehl aus two
und 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
curl
gibt aus, was heruntergeladen wird, daher wird die Datei unter heruntergeladen get.rvm.io
und der Inhalt an bash weitergeleitet. Wenn Sie den curl
Befehl nur selbst ausführen, sehen Sie, dass es sich um ein bash
Skript handelt, das rvm herunterlädt und installiert
|
ist mir vertrauter. Warum benutzte er die seltsame Syntax? Ist das ein Trend?
pipe
?
<<
ist der Dokumentoperator hier . foo < <(bar)
ist meist gleichwertig bar | foo
mit hauptsächlich,:, aber mit einigen Unterschieden , die hier keine Rolle zu tun < <(…)
, foo
führt eine in der Haupt - Shell - Umgebung, und wenn der Befehl foo
zurückkehrt, während bei einem Rohr, foo
fü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.)