如何为程序创建合并输入(stdin)

如何为程序创建合并输入(stdin)

考虑这样的脚本:

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 或类似的内容,但如果调用内部命令在某种程度上很昂贵,您将多次支付该价格。我怀疑有什么办法可以解决这个问题。

相关内容