考虑这样的脚本:
echo a
echo b
echo c
它将生成 3 行,现在我可以像这样运行它:
abc_script | real_program
real_program
将在其输入中获取这 3 个文件。然而,对于用户来说存在一个问题,abc_script
她/他必须记住将输出重定向到real_program
.
那么如何将这个重定向移到脚本中呢?像这样的东西(脚本):
echo a | echo b | echo c | real_program
这不起作用,这只是我想要做的一个说明——隐藏real_program
脚本内部的调用。
郑重声明:在我的例子中,输入由一些文件和额外的行组成。所以我有:
cat $input_file
echo $extra_line
不只是a、b、c。
答案1
像这样:
( echo a
echo b
echo c ) | real_program
它在子 shell 中运行这三个echo
命令,并将子 shell 的输出通过管道传输到脚本。
子壳是 的语法糖bash -c 'echo a; echo b; echo c' | real_program
。
答案2
另一种方法是
echo -e "$(cat $input_file)\n$extra_line" | real_program
答案3
<()
第三种方法是重定向命令的输入,它至少适用于 GNU bash 4.2.37,并且应该适用于任何最近的 bash 和可能的其他 shell(我不知道一般支持如何)。
$ echo hello > test
$ echo my > test
$ echo beautiful > test
$ cat <(cat test; echo world)
hello
my
beautiful
world
$
这个想法是首先创建文件,然后cat
从命令序列的输出启动重定向其标准输入cat test; echo world
。从输出中可以看出,该输入成为所有输入重定向命令的输出的串联。
表达相同内容的另一种方法(可能更便携)是将其简单地重写为普通的旧子 shell 管道到命令中:
(cat test; echo world) | cat
请注意,命令是按顺序执行的,但它们的输出成为外部或下一个命令输入上的单个流。因此,虽然上面示例中的外部命令cat
看不到 EOF 或类似的内容,但如果调用内部命令在某种程度上很昂贵,您将多次支付该价格。我怀疑有什么办法可以解决这个问题。