如何将参数传递给输入bash的脚本


10

现在我有一个这样的班轮:

curl -fsSL http://git.io/vvZMn | bash

它正在下载脚本并将其作为stdin文件传递到bash。我想使用其他参数运行此脚本print

也许是这样的吗?

curl -fsSL http://git.io/vvZMn | bash -- print

但这是行不通的。


4
print打算在这里做什么?显示正在运行的命令?如果是这样,请尝试bash -x。注意:此curl | bash例程是一个巨大的安全漏洞;您不知道将要运行什么,直到服务器被伪装好为止。
史蒂芬·哈里斯

Answers:


16

我相信您正在寻找的是-s选项。使用-s,您可以将参数传递给脚本。

作为一个虚拟的例子来说明这一点:

$ echo 'echo 1=$1' | bash -s -- Print
1=Print

在这里,您可以看到stdin上提供的脚本被赋予了positional参数Print。您的脚本带有一个-u UUID参数,也可以容纳:

$ echo 'echo arguments=$*' | bash -s -- -u UUID print
arguments=-u UUID print

因此,在您的情况下:

curl -fsSL http://git.io/vvZMn | bash -s -- print

要么,

curl -fsSL http://git.io/vvZMn | bash -s -- -u UUID print

正如史蒂芬·哈里斯(Stephen Harris)所指出的那样,出于安全考虑,下载脚本并执行它是看不见的。


3

如果您的系统有/dev/stdin,您可以使用

$ echo 'echo 1=$1' | bash /dev/stdin print
1=print

难道不是这样做:

$ echo 'echo 1=$1' | bash /dev/stdin -- print
1=--

如果要使用--,请执行以下操作:

$ echo 'echo 1=$1' | bash -- /dev/stdin print
1=print
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.