将参数传递给使用 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~
我正在测试我在 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~