是否有与“tee”相反的功能,将多个管道连接在一起?

是否有与“tee”相反的功能,将多个管道连接在一起?

STDOUT我有几个进程在和上生成输出STDERR,我已将其重定向到编号文件描述符,并且我想将所有输出整理到一个文件中。

我曾天真地尝试过

[input processes] | cat <3 <4 <5 2>&1 >[output file]

但当然,这不起作用,因为 cat 会等到它的STDIN管道关闭后再从任何后续管道读取数据,从而导致我的进程在其他管道的缓冲区变满时挂起。

有什么建议么?

答案1

将输出整理在一起并不是真正的对偶teetee制作其输入的多个副本,而整理输出不涉及任何数据合并。

要合并输出源,只需将它们全部重定向到同一文件描述符即可。一般来说,源的交错在某种程度上是不可预测的,但对管道的写入足够小保证是原子的。 (能够从读取端辨别边界是另一回事.)

{ data_source_1 &
  data_source_2 &
  wait; } >merged_output

如果您从多个文件描述符获取输入并且想要合并它们,请传递每个文件描述符。

{ cat <&3 & cat <&4 & wait; } >merged_ouput

但通常您可以将所有文件描述符重定向到同一目的地。

… 3>merged_ouput 4>&3

答案2

需要在每个进程的STDOUT中添加STDERR和STDOUT。

例子:
processA 2>&1 | processB | processC

STDOUT 和 STDERR 将通过 PIPE 重定向为 processB 的 STDIN。然而,processC 只会将 ProcessB 的 STDOUT 作为 STDIN 获取。

因此,如果您需要 processB 的 STDOUT 和 STDERR 作为 processC 的 STDIN ,那么: processA 2>&1 | processB 2>&1 | processC

如果您真的不想使用管道,但只想将所有类型的输出重定向到单个文件中,您可以这样做:

(processA; processB) >./just_STDOUT.txt

(processA 2>&1; processB 2>&1) >./STDOUT_AND_STDERR.txt

相关内容