我知道如何通过以下语法执行远程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
答案 0 :(得分:69)
试
curl http://foo.com/script.sh | bash -s arg1 arg2
bash手册说:
如果存在-s选项,或者在选项处理后没有参数,则从标准输入读取命令。此选项允许在调用交互式shell时设置位置参数。
答案 1 :(得分:54)
要稍微改进jinowolski's answer,您应该使用:
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,所以你可以通过echo验证它是否适用于简单的BASH脚本输入:
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
答案 2 :(得分:14)
其他替代方案:
curl http://foo.com/script.sh | bash /dev/stdin arguments
bash <( curl http://foo.com/script.sh ) arguments