web-dev-qa-db-fra.com

passage de paramètres à bash lors de l'exécution d'un script récupéré par curl

Je sais comment exécuter un script bash distant, via ces syntaxes:

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

ou

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

qui donnent le même résultat.

Mais que faire si je dois passer des arguments au script bash? C'est possible lorsque le script est enregistré localement:

./script.sh argument1 argument2

J'ai essayé plusieurs possibilités comme celle-ci, sans succès:

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

essayer

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

le manuel bash dit:

Si l'option -s est présente ou s'il ne reste aucun argument après le traitement de l'option, les commandes sont lues à partir de l'entrée standard. Cette option permet de définir les paramètres de position lors de l'appel d'un shell interactif.

69
jinowolski

Pour améliorer la réponse de jinowolski un peu, vous devez utiliser:

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

Remarquez les deux tirets (-) qui indiquent à bash de ne rien traiter en tant qu'arguments à bash.

De cette façon, cela fonctionnera avec tout type d'arguments, par exemple:

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

Cela fonctionnera bien sûr avec tout type d'entrée via stdin, pas seulement curl, vous pouvez donc confirmer qu'il fonctionne avec une simple entrée de script BASH via echo:

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

Vous donnera la sortie

1 = -a1
2 = -a2
3 = -a3
4 = --long
5 = some_text
61
Janne Enberg

Autres alternatives:

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