¿Qué significa una redirección "<<(...)"?

32

He visto que rvm (administrador de versiones de ruby) se instala con el siguiente comando:

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

Entonces, según tengo entendido, obtenemos el contenido del script y lo pasamos al bash (¿creo < <y <<es lo mismo?) Estoy interesado en la < <parte, que se encuentra en la siguiente descripción en la red:

<< token Significa usar el flujo de entrada actual como STDIN para el programa hasta que se vea el token.

Esto de alguna manera no está claro para mí, ¿alguien puede dar un ejemplo o explicarlo de una manera más simple?

Stonerain
fuente

Respuestas:

40

No, < <y <<no son lo mismo.

El primero se compone del <carácter de redireccionamiento común combinado con el primer carácter de la <(command)sintaxis. Esta es una kshconstrucción (también encontrada en bashy zsh) conocida como sustitución de proceso que toma la salida commandy la proporciona en un archivo cuyo nombre hace referencia al otro extremo de la tubería en el que commandestá escribiendo.

En otras palabras, puede pensar < <(command)como < file, donde el archivo contiene la salida de command.

enzotib
fuente
55
Aprendí sobre este comando hace unos días, es un comando muy útil. Las cosas que puede hacer con esto solo están limitadas por su imaginación: por ejemplo, este comando le brinda una lista de solo archivos ocultos:diff <(ls) <(ls -a)
Khaja Minhajuddin
1
Esta sintaxis podría ser bastante útil, pero en el caso específico de Stonerain, no parece proporcionar ningún valor agregado en comparación con una tubería simple.
jlliagre
1
En la sintaxis anterior no ayuda. Pero si lo cambia un poco, es mucho mejor: en bash <(curl ...)lugar de bash < <(curl ...)no robar STDIN, por lo que puede responder preguntas y proporcionar comentarios en el script.
tylerl
Usar <() parece ser una gran alternativa para enviar múltiples variables $ a comandos directamente, en lugar de tener que escribir innecesariamente las variables $ a archivos primero. diff <(echo "$ text1") <(echo "$ text2") stackoverflow.com/questions/13437104/…
Sepero
18

Es una forma complicada de hacer lo más simple:

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