2011-01-10 6 views
28

Sé cómo ejecutar escritura del golpe a distancia, a través de estas sintaxis:pasar parámetros a golpear a la hora de ejecutar un guión inverosímil por rizo

curl http://foo.com/script.sh | bash 

o

bash < <(curl http://foo.com/script.sh) 

que dan el mismo resultado.

¿Pero y si necesito pasar argumentos al script bash? Es posible cuando el guión se guarda localmente:

./script.sh argument1 argument2 

he intentado varias posibilidades como ésta, sin éxito:

bash < <(curl http://foo.com/script.sh) argument1 argument2 

Respuesta

54

tratar

curl http://foo.com/script.sh | bash -s arg1 arg2 

manual de fiesta dice:

Si la opción -s está presente, o si no hay argumentos remanentes en el procesamiento posterior a la opción, los comandos se leen desde la entrada estándar. Esta opción permite configurar los parámetros posicionales cuando se invoca un shell interactivo.

+3

Gracias! Extremadamente útil con gists :) –

+1

No funciona si arg1 es un arg corto: curl http://foo.com/script.sh | bash -s -y – Xorax

+1

¿Qué pasa con los parámetros que usan claves como '-p blah -d blah'? – CMCDragonkai

13

Otras alternativas:

curl http://foo.com/script.sh | bash /dev/stdin arguments 
bash <(curl http://foo.com/script.sh) arguments 
+2

Todos los métodos difieren en $ 0 argumento. Para "-s" es "bash", para "/ dev/stdin" es "/ dev/stdin" y "<(...)" da un argumento de $ 0 como "/ dev/fd/63". – jinowolski

+0

La primera alternativa funciona con argumentos de script que comienzan con '-', es decir, opciones –

+0

Por favor, dé un ejemplo para un argumento que me permita saber el formato –

37

mejorar jinowolski's answer un poco, se debe utilizar:

curl http://example.com/script.sh | bash -s -- arg1 arg2 

Aviso los dos guiones (-), que están diciendo bash para no procesar nada siguiéndolo como argumentos para bash.

Esta manera de que funcione con cualquier tipo de argumentos, por ejemplo:

curl -L http://bootstrap.saltstack.org | bash -s -- -M -N stable 

Esta voluntad de trabajo del curso con cualquier tipo de entrada a través de la entrada estándar, no sólo rizo, por lo que puede confirmar que funciona con sencillo entrada de escritura del golpe a través de eco:

echo 'i=1; for a in [email protected]; do echo "$i = $a"; i=$((i+1)); done' | \ 
bash -s -- -a1 -a2 -a3 --long some_text 

le dará la salida

1 = -a1 
2 = -a2 
3 = -a3 
4 = --long 
5 = some_text 
+1

Una excelente sugerencia, y muy claro en cuanto a la razón por la que debe hacer esto. – shrikeh

+0

Gracias por la clara explicación. ¡Este truco es realmente útil! – agate

Cuestiones relacionadas