如何在管道bash脚本到bash时设置参数

Grz*_*cki 6 bash pipe shell-script

如何使用参数执行 bash 脚本:

./foo.sh a b c
Run Code Online (Sandbox Code Playgroud)

当它被压缩时(例如使用xz)。

 xzcat foo.sh | bash <<how_to_supply_here_parameters?>>
Run Code Online (Sandbox Code Playgroud)

具体用例:

我制作了非常大的rmlint.sh文件并将其压缩存储:

time rmlint -o sh:stdout -c sh:hardlink|tee >( xz > rmlint.sh.xz )
Run Code Online (Sandbox Code Playgroud)

因此我通常会执行

./rmlint.sh -d -x -p
Run Code Online (Sandbox Code Playgroud)

但是,文件太大无法解压缩。因此,我很乐意通过管道将其传递给 bash 来做同样的事情:

xzcat rmlint.sh.xz | bash ...
Run Code Online (Sandbox Code Playgroud)

mos*_*svy 16

您应该使用-s选项和--分隔要传递的参数:

echo 'echo "$@"' | sh -s 3 4 5

echo 'printf "{%s}" "$0"; printf " {%s}" "$@"; echo' |
    sh -s -- -d -x -p --foo=bar
{sh} {-d} {-x} {-p} {--foo=bar}
Run Code Online (Sandbox Code Playgroud)

这应该适用于任何 POSIX shell,而不仅仅是bash. 从susv4

-s 从标准输入读取命令。

如果没有操作数-c且未指定-s 选项,则应假定选项。

  • 像往常一样,您使用 `--` 选项结束标记。参见第二个例子。 (2认同)