如何将一个程序的标准输入作为参数传递给另一个程序?

如何将一个程序的标准输入作为参数传递给另一个程序?

假设存在一个程序,它有两个参数;输入文件和输出文件。

如果我不想将此输出文件保存到磁盘,而是将其直接传递给stdin另一个程序怎么办?有办法实现这一点吗?

我在 Linux 上遇到的许多命令都提供了一个选项来传递“-”作为输出文件参数,这会执行我上面指定的操作。这是因为stdin不可能将程序作为参数传递吗?如果是的话,我们该怎么做呢?

我如何使用它进行成像的一个例子是:

pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" stdin(echo)

我使用的 shell 是 bash。

答案1

如果程序支持写入任何文件描述符,即使它无法查找,您也可以将其用作/dev/stdout输出文件。这是/proc/self/fd/1我系统上的符号链接。文件描述符 1 是标准输出。

答案2

pdftotext手册页:

如果文本文件为“-”,则文本将发送到标准输出。

所以在这种情况下你需要的是:

pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" -

或者,如果您想将其通过管道传输到另一个程序的 STDIN:

pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" - | another_prog

当我们需要从 STDIN 输入或输出到 STDOUT 时,使用-替代文件名是许多实用程序(包括 pdftotext)遵循的约定。然而,并非所有实用程序都遵循此约定。在这种情况下,在 bash 中执行此操作的惯用方法是使用流程替代:

my_utility "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" >( cat )

这里的>( )行为很大程度上类似于传递给 的文件my_utility,但流不是真正的文件,而是通过管道传输到所包含进程的标准输入(即 cat)中。所以在这里,文本最终应该按照要求输出。

使用cat几乎总是引发UUOC警钟长鸣在这样的论坛上。我认为,如果该实用程序不支持-,那么这是 的有用用途cat,但如果有任何方法可以在不使用 的情况下进行此过程替换cat,那么我会洗耳恭听;-)。

但是,如果(如问题所述)流的最终目的地是另一个程序的 STDIN,则cat可以消除:

my_utility "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" >( another_prog )

答案3

如果您的 shell 支持它们,执行此类操作的最简单方法是使用流程替代<(…)>(…)。这适用于 bash、zsh 和 ksh 以及可能的其他 shell。例如:

$ sort <(printf "b\nc\na\n")
a
b
c
$ ls
foo
$ cp <(find . -name foo) bar
$ ls
bar  foo

但是,这对您所说的示例没有帮助,因为pdftotext它将保存在文本文件中。虽然您的最佳选择(除了明显的 using 之外-)是按照 @TiCPU 的建议使用/dev/stdout,但您也可以使用另一种 shell 功能。该构造!:N引用前一个命令的第 N 个参数。因此,你可以这样做:

$ pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf"  out.txt
$ cat !:2

答案4

cmd tty

tty返回连接到 的终端的名称stdout

相关内容