passer des paramètres à bash lors de l'exécution d'un script récupéré par curl
je sais comment exécuter le script bash à distance, 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 sauvegardé 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
3 réponses
essayer
curl http://foo.com/script.sh | bash -s arg1 arg2
manuel bash dit:
si l'option-s est présente, ou si aucun argument ne reste après le traitement de l'option, alors les commandes sont lues à partir de l'entrée standard. Cette option permet de définir les paramètres de position lors de l'invocation d'un shell interactif.
pour améliorer sur réponse de jinowolski un peu, vous devriez utiliser:
curl http://example.com/script.sh | bash -s -- arg1 arg2
remarquez les deux tirets (--) qui disent à bash de ne pas traiter quoi que ce soit après lui comme arguments pour bash.
de cette façon, il fonctionnera avec n'importe quel type d'arguments, par exemple:
curl -L http://bootstrap.saltstack.org | bash -s -- -M -N stable
cela fonctionnera bien sûr avec n'importe quel type d'entrée via stdin, pas seulement curl, de sorte que vous pouvez confirmer qu'il fonctionne avec BASH simple entrée du script 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 variantes:
curl http://foo.com/script.sh | bash /dev/stdin arguments
bash <( curl http://foo.com/script.sh ) arguments