【问题标题】:Passing parameters to bash when executing a script fetched by curl执行 curl 获取的脚本时将参数传递给 bash
【发布时间】: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

【问题讨论】:

    标签: bash curl parameter-passing


    【解决方案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”,“
    • 第一个替代方案使用以- 开头的脚本参数,即选项
    • 请给出一个参数的例子让我知道格式
    猜你喜欢
    • 2015-07-12
    • 2021-11-18
    • 2016-12-21
    • 2016-05-06
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    相关资源
    最近更新 更多