执行 curl 获取的脚本时将参数传递给 bash
Posted
技术标签:
【中文标题】执行 curl 获取的脚本时将参数传递给 bash【英文标题】:Passing parameters to bash when executing a script fetched by curl 【发布时间】:2011-06-06 06:54:34 【问题描述】:我知道如何像这样执行远程 Bash 脚本:
curl http://example.com/script.sh | bash
或
bash < <( curl http://example.com/script.sh )
给出相同的结果。
但是如果我需要将 参数 传递给 bash 脚本怎么办?当脚本保存在本地时是可能的:
./script.sh argument1 argument2
我尝试了几种类似的可能性,但都没有成功:
bash < <( curl http://example.com/script.sh ) argument1 argument2
【问题讨论】:
【参考方案1】:要稍微改进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
这当然适用于通过标准输入的任何类型的输入,而不仅仅是 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
【讨论】:
一个很好的建议,并且非常清楚你应该这样做的原因。 感谢您的明确解释。这招真有用! 为了更加安全,建议使用curl --fail ...
。例如,它使 curl 在 404 上停止。一组常见的选项是-fsSL
(-f
是--fail
的缩写)。
如果命令因为询问是或否问题而失败怎么办?
谢谢!这是唯一对我有用的解决方案,即curl -fsSL https://starship.rs/install.sh | bash -s -- --yes
。【参考方案2】:
试试
curl http://foo.com/script.sh | bash -s arg1 arg2
bash 手册说:
如果存在 -s 选项,或者在选项处理后没有保留任何参数,则从标准输入读取命令。此选项允许在调用交互式 shell 时设置位置参数。
【讨论】:
谢谢!对要点非常有用:) 使用-p blah -d blah
之类的键的参数呢?
脚本中的read
这样被直接忽略了,如何解决?【参考方案3】:
其他选择:
curl http://foo.com/script.sh | bash /dev/stdin arguments
bash <( curl http://foo.com/script.sh ) arguments
【讨论】:
所有方法在 $0 参数上都不同。 “-s”是“bash”,“/dev/stdin”是“/dev/stdin”,“ 第一个替代方案使用以-
开头的脚本参数,即选项
请给出一个参数的例子让我知道格式以上是关于执行 curl 获取的脚本时将参数传递给 bash的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Linux 中使用终端命令将文件参数传递给我的 bash 脚本? [复制]