передача параметров в bash при выполнении скрипта, полученного с помощью curl - PullRequest
42 голосов
/ 10 января 2011

Я знаю, как выполнить скрипт удаленного bash, используя следующие синтаксисы:

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

или

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

, которые дают тот же результат.

Но что, если мне нужно передать аргументы скрипту bash? Это возможно, когда скрипт сохраняется локально:

./script.sh argument1 argument2

Я попробовал несколько вариантов, подобных этой, но безуспешно:

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

Ответы [ 3 ]

69 голосов
/ 10 января 2011

1001 * попробовать *

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

Руководство по bash гласит:

Если присутствует опция -s или если после обработки опции не осталось аргументов, команды считываются из стандартного ввода. Эта опция позволяет устанавливать позиционные параметры при вызове интерактивной оболочки.

58 голосов
/ 29 августа 2014

Чтобы немного улучшить ответ jinowolski , вы должны использовать:

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

Обратите внимание на две черты (-), которые говорят bash, что ничего не следует после него в качестве аргументовbash.

Таким образом, он будет работать с любыми аргументами, например:

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

Это, конечно, будет работать с любым вводом через stdin, а не только с помощью curl, поэтомуможет подтвердить, что он работает с простым вводом скрипта BASH через echo:

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

Даст вам вывод

1 = -a1
2 = -a2
3 = -a3
4 = --long
5 = some_text
14 голосов
/ 10 января 2011

Другие альтернативы:

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