2011-05-19 26 views
13

He estado usando RVM por un tiempo, y cada vez que acaba de copiar y pegar el siguiente comando para conseguir que la configuración:¿Alguien puede explicar esta sintaxis?

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

me molesta que no entiendo plenamente la sintaxis, y por qué necesitamos el doble < y los paréntesis. ¿Puede alguien explicar esto o señalarme a la referencia correcta?

+1

¿Hay alguna razón para que esto no sea solo: "curl -s ... | bash"? Parece un ejemplo de deslizamiento excesivo de características. –

+0

@William Pursell: No conozco ninguna diferencia de comportamiento entre su versión y esta. – Daenyth

Respuesta

13

El primero es la redirección de entrada. Alimenta el contenido de un archivo en el programa como entrada. La segunda construcción es <() y es una redirección de procesos: trata la salida de un proceso como un archivo. En este caso, el efecto es que ejecutará el contenido de esa url como si fuera un script bash, ¡muy peligroso! Si no confías en la fuente por completo, no hagas eso. Un atacante podría usar este método para que ejecute comandos que comprometan su sistema.

+2

Buena respuesta, especialmente al notar el problema de seguridad. – Mattis

+0

Para conocer esta característica, intente esto: 'echo <(id)' Le dará una idea de cómo se implementa el sistema y cómo se puede abusar (por ejemplo, 'dd if = <(look foo)' 'cp <(mira foo)/tmp/x' etc.) –

2

Sólo mis 2 centavos. Bashs estructura <() como @Daenyth declaró "trata la salida de un proceso como un archivo". Esta estructura puede ser muy útil. Sólo considere lo siguiente:

diff <(ls dir1) <(ls dir2) 

Esto utilizará vimdiff para mostrar las diferencias entre los contenidos de dir1 y directorio2. Usando vimdiff en su lugar diff se enfriará aún más.

Cuestiones relacionadas