执行 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 脚本? [复制]

如何将文件路径作为 bash 脚本中的参数传递给函数? [复制]

如何将数组参数传递给 Bash 脚本

sh 如何将参数传递给Bash脚本

sh 将参数传递给Bash脚本

将命令行参数传递给python脚本[重复]