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

Ben*_*min 4 shell io-redirection

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

我天真地尝试过

[input processes] | cat <3 <4 <5 2>&1 >[output file]
Run Code Online (Sandbox Code Playgroud)

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

有什么建议?

Gil*_*il' 6

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

要合并输出源,只需将它们全部重定向到相同的文件描述符。源的交错通常有些不可预测,但保证对管道的足够小写入是原子的。(能够从阅读方面说出界限是另一回事。)

{ data_source_1 &
  data_source_2 &
  wait; } >merged_output
Run Code Online (Sandbox Code Playgroud)

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

{ cat <&3 & cat <&4 & wait; } >merged_ouput
Run Code Online (Sandbox Code Playgroud)

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

… 3>merged_ouput 4>&3
Run Code Online (Sandbox Code Playgroud)