假设存在一个程序,它有两个参数;输入文件和输出文件。
如果我不想将此输出文件保存到磁盘,而是将其直接传递给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
。