Que signifie une redirection «<<(…)»?

32

J'ai vu que rvm (ruby version manager) est installé à l'aide de la commande suivante:

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

Donc, si je comprends bien, nous obtenons le contenu du script et le passons à la bash (je crois < <et <<c’est la même chose?) Je suis intéressé par la < <partie, trouvée ci-dessous sur le net:

<< jeton Signifie que le flux d'entrée actuel est défini comme STDIN pour le programme jusqu'à ce que le jeton soit visible.

Ce n'est pas clair pour moi, quelqu'un peut-il donner un exemple ou l'expliquer d'une manière plus simple?

Stonerain
la source

Réponses:

40

Non, < <et <<ne sont pas la même chose.

Le premier est composé du <caractère de redirection commun combiné au premier caractère de la <(command)syntaxe. Il s'agit d'une kshconstruction (également trouvée dans bashet zsh) connue sous le nom de substitution de processus qui prend la sortie de commandet la fournit dans un fichier dont le nom fait référence à l'autre extrémité du canal dans lequel elle commandécrit.

En d'autres termes, vous pouvez penser < <(command)à < file, où fichier contient la sortie de command.

enzotib
la source
5
J'ai appris l'existence de cette commande il y a quelques jours, c'est une commande très utile. Les choses que vous pouvez faire avec cela ne sont limitées que par votre imagination: cette commande, par exemple, ne vous donne la liste que des fichiers cachés:diff <(ls) <(ls -a)
Khaja Minhajuddin
1
Cette syntaxe pourrait en effet être très utile, mais dans le cas spécifique de Stonerain, elle ne semble pas apporter de valeur ajoutée par rapport à un simple canal.
Juillet
1
Dans la syntaxe ci-dessus, cela n'aide pas. Mais si vous le modifiez légèrement, c'est beaucoup mieux: bash <(curl ...)au lieu de bash < <(curl ...)ne pas voler STDIN, vous êtes libre de répondre aux invites et de fournir des entrées dans le script.
Tylerl
L'utilisation de <() semble être une excellente alternative pour envoyer directement plusieurs variables $ à des commandes, au lieu d'avoir à écrire inutilement les variables $ dans des fichiers. diff <(echo "$ text1") <(echo "$ text2") stackoverflow.com/questions/13437104/…
Sepero
18

C'est une manière compliquée de faire le plus simple:

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