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
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.
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
Autres alternatives:
curl http://foo.com/script.sh | bash /dev/stdin arguments
bash <( curl http://foo.com/script.sh ) arguments