我有一个程序输出一个文件,我想将其用作下一个程序的标准输入。但是,program2 有“-in”和“-out”选项,需要文件名。因此,如果我要通过管道传输到 program2,我该如何引用“-in”选项的标准输入?
program1 | program2 -in stdin -out filename
答案1
如果program2
本身不使用其 stdin 并且-in
是指定输入文件的唯一方法,则这些是有用的选项:
/dev/stdin
或/proc/fd/0
或/proc/self/fd/0
(如果可用;内核特性,POSIX 不要求)program1 | program2 -in /dev/stdin -out filename
进程替换(Bash 和其他一些 shell 支持,POSIX 不要求)
program2 -in <(program1) -out filename
命名 fifo (POSIX 方式)
mkfifo foo program1 >foo & # in background program2 -in foo -out filename rm fifo
请注意,许多通常不使用 stdin 的程序这样做是有原因的:它们需要输入文件可查找。<bar program2
您可以使用文件描述符 0 指向program2
可bar
查找的文件,但通常 stdin 不可查找,因此此类程序不会使用它。如果程序期望文件可查找,上述每种方法都可能使您的程序失败。
答案2
你可以做类似的事情
program1 > stdin & program2 -in stdin -out filename
这实际上不是一个管道,而是将程序 1 的所有标准输出放入标准输入文件中,以便程序 2 可以读取它。
另外,有些程序在尝试从 shell 读取/写入时使用简写 -。因此,它可能类似于:
program1 | program2 -in - -out filename
答案3
通过将输入文件指向特殊文件,以下语法应在 shell 中起作用/dev/stdin
:
program1 | program2 -in /dev/stdin -out filename