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

时间:2015-12-15 23:14:21

标签: linux bash shell unix sh

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

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

我的问题是,如何将参数传递给相关脚本?我尝试了bash -c --help,但由于它被解释为脚本的一部分,因此无法正常工作。

谢谢!

2 个答案:

答案 0 :(得分:2)

通过将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

答案 1 :(得分:2)

我会回应Anthony的评论 - 下载脚本并直接执行它会更有意义,但是如果你真的开始使用bash的-c选项,那就有点复杂了,问题是当你这样做时:

something | xargs -0 bash -c

没有机会传递任何论据。它们都被作为-c的论据吞噬 - 它基本上变成了:

bash -c "$(something)"

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

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

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

我可以通过以下方式模仿:

echo 'echo hi: ~$0~ ~$1~ ~$2~ ~$3~' | xargs -0 -I @ bash -c @ something one two three four

产生:

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