如何在管道中的程序中引用 stdin 作为选项?

如何在管道中的程序中引用 stdin 作为选项?

我有一个程序输出一个文件,我想将其用作下一个程序的标准输入。但是,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 指向program2bar查找的文件,但通常 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

相关内容