将参数传递给使用 bash -c 调用的脚本

Passing arguments to a script invoked with bash -c

我正在测试我在 GitHub 上创建的 Bash 脚本的行为正确性(例如,它能正确解析选项)。我想这样做而不必在本地克隆存储库,所以我是这样做的:

curl -sSL https://github.com/jamesqo/gid/raw/master/gid | xargs -0 bash -c

我的问题是,如何将参数传递给相关脚本?我尝试了 bash -c --help,但没有成功,因为它被解释为脚本的一部分。

谢谢!

您实际上将 xargs 与 Bash 的 -c 选项一起使用使事情过于复杂。

直接下载脚本

您不需要将存储库克隆到 运行 脚本。直接下载即可:

curl -o gid https://raw.githubusercontent.com/jamesqo/gid/master/gid

现在它已下载为 gid,您可以 运行 它作为 Bash 脚本,例如,

bash gid --help

您还可以使下载的脚本可执行,以便 运行 将其作为常规 Unix 脚本文件(使用其 shebang,#!/bin/bash):

chmod +x gid
./gid --help

使用进程替换

如果您想 运行 脚本而不实际将其保存到文件中,您可以使用 Bash 进程替换:

bash <(curl -sSL https://github.com/jamesqo/gid/raw/master/gid) --help

我会附和 Anthony 的意见 - 下载脚本并直接执行它更有意义,但如果你真的设置为 bash 使用 -c 选项,有点复杂,问题是当你这样做时:

something | xargs -0 bash -c

没有机会传递任何参数。它们都作为 -c 的参数被吞没了——它实际上变成了:

bash -c "$(something)"

所以如果你在 xargs 中的 -c 之后放置一些东西,它就会在 something 之前。没有机会在某些东西之后放置任何东西,因为 xargs 不允许你。

如果你想传递参数,你必须使用xargs的替换位置选项,它允许你放置参数的位置,选项是-J <item>,接下来要实现的是第一个参数将是 [=19=],所以你必须这样做:

something | xargs -0 -I @ bash -c @ something <arg1> <arg2>…

我可以模拟这个:

echo 'echo hi: ~[=13=]~ ~~ ~~ ~~' | xargs -0 -I @ bash -c @ something one two three four

产生:

hi: ~something~ ~one~ ~two~ ~three~