Was bedeutet eine "<<(…)" - Umleitung?

32

Ich habe gesehen, dass rvm (ruby version manager) mit dem folgenden Befehl installiert wird:

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

So wie ich es verstehe, bekommen wir den Skriptinhalt und übergeben ihn an die Bash (ich glaube < <und <<ist das Gleiche?). Ich interessiere mich für den < <Teil, der folgende Beschreibung im Internet findet:

<< Token Bedeutet, dass der aktuelle Eingabestream als STDIN für das Programm verwendet wird, bis das Token angezeigt wird.

Das ist mir irgendwie nicht klar, kann mir jemand ein Beispiel geben oder es einfacher erklären?

Stonerain
quelle

Antworten:

40

Nein, < <und <<sind nicht dasselbe.

Das erste setzt sich aus dem gemeinsamen <Umleitungszeichen und dem ersten Zeichen der <(command)Syntax zusammen. Dies ist ein kshKonstrukt (auch in bashund enthalten zsh), das als Prozessersetzung bezeichnet wird und dessen Ausgabe commandin einer Datei bereitgestellt wird, deren Name sich auf das andere Ende der Pipe bezieht, in die geschrieben commandwird.

Mit anderen Worten kann man sich vorstellen , < <(command)wie < file, wo Datei enthält die Ausgabe command.

Enzotib
quelle
5
Ich habe vor ein paar Tagen von diesem Befehl erfahren, es ist ein sehr nützlicher Befehl. Die Dinge, die Sie damit tun können, sind nur durch Ihre Vorstellungskraft begrenzt: Beispielsweise gibt Ihnen dieser Befehl eine Liste mit nur versteckten Dateien:diff <(ls) <(ls -a)
Khaja Minhajuddin
1
Diese Syntax mag in der Tat sehr nützlich sein, aber im konkreten Fall von Stonerain scheint sie im Vergleich zu einer einfachen Pipe keinen Mehrwert zu bieten.
Juli
1
In der obigen Syntax hilft es nicht. Wenn Sie es jedoch geringfügig ändern, ist es viel besser: bash <(curl ...)Statt bash < <(curl ...)STDIN zu stehlen, können Sie Eingabeaufforderungen beantworten und Eingaben im Skript vornehmen.
tylerl
Die Verwendung von <() scheint eine gute Alternative zu sein, um mehrere $ -Variablen direkt an Befehle zu senden, anstatt die $ -Variablen unnötigerweise zuerst in Dateien schreiben zu müssen. diff <(echo "$ text1") <(echo "$ text2") stackoverflow.com/questions/13437104/…
Sepero
18

Es ist eine verschlungene Art, das Einfachere zu tun:

curl -s https://raw.github.com/... | bash
jlliagre
quelle