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
32
demandé sur Daniel R 2011-01-10 04:06:43

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.

58
répondu jinowolski 2011-01-10 01:19:47

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
44
répondu Janne Enberg 2014-08-29 07:11:17

autres variantes:

curl http://foo.com/script.sh | bash /dev/stdin arguments
bash <( curl http://foo.com/script.sh ) arguments
13
répondu ephemient 2011-01-10 01:20:32