Bash - 如何将参数传递给通过重定向标准输入读取的脚本

15
我想更详细地说明一下关于“Bash - 如何向通过标准输入读取的脚本传递参数”帖子。
我想创建一个脚本,它接受标准输入并远程运行它,同时向其传递参数。
我正在构建的脚本的简化内容:
ssh server_name bash <&0

我该如何将接受参数的以下方法应用到我的脚本中?

cat script.sh | bash /dev/stdin arguments

也许我做错了,希望你能提供其他的解决方案。


这个应用程序的命令行参数不足? - Brian Cain
如何向 ssh server_name bash <&0 提供命令行参数,以便它们不被解释为 bash 选项? - dabest1
3个回答

19

尝试这个:

cat script.sh | ssh some_server bash -s - <arguments>

2

ssh 无需改变:

$ cat do_x 
#!/bin/sh

arg1=$1
arg2=$2
all_cmdline=$*
read arg2_from_stdin

echo "arg1: ${arg1}"
echo "arg2: ${arg2}"
echo "all_cmdline: ${all_cmdline}"
echo "arg2_from_stdin: ${arg2_from_stdin}"

$ echo 'a b c' > some_file
$ ./do_x 1 2 3 4 5 < some_file 
arg1: 1
arg2: 2
all_cmdline: 1 2 3 4 5
arg2_from_stdin: a b c
$ ssh some-server do_x 1 2 3 4 5 < some_file
arg1: 1
arg2: 2
all_cmdline: 1 2 3 4 5
arg2_from_stdin: a b c

抱歉,这不是我想要的。从你的例子ssh some-server do_x 1 2 3 4 5 < some_file中,将do_x替换为标准输入:bash <&0,并将此行放在do_x脚本中。那么现在,我该如何传递参数? - dabest1
我不明白。你是在尝试在 do_x 中编写自己的 shell 吗? - Brian Cain
我正在尝试创建一个包装脚本,可以远程运行任何提供的脚本。同时,我希望支持任何管道输入。 - dabest1
为什么不直接在脚本中“source”共同的特性,而不是进行包装呢? - Brian Cain
可能不是OP想要的答案,但是很棒的内容!感谢分享@BrianCain。祝大家好运。 - shellter
谢谢您的建议,但是包装脚本处理复杂逻辑,我想通过包装器运行任何脚本,而不修改这些脚本。 - dabest1

0

这个变体似乎也很好用,来自ccartonanswer:

ssh some_server bash -s - < script.sh <arguments>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接