STDOUT
我有几个进程在和上生成输出STDERR
,我已将其重定向到编号文件描述符,并且我想将所有输出整理到一个文件中。
我曾天真地尝试过
[input processes] | cat <3 <4 <5 2>&1 >[output file]
但当然,这不起作用,因为 cat 会等到它的STDIN
管道关闭后再从任何后续管道读取数据,从而导致我的进程在其他管道的缓冲区变满时挂起。
有什么建议么?
答案1
将输出整理在一起并不是真正的对偶tee
。tee
制作其输入的多个副本,而整理输出不涉及任何数据合并。
要合并输出源,只需将它们全部重定向到同一文件描述符即可。一般来说,源的交错在某种程度上是不可预测的,但对管道的写入足够小保证是原子的。 (能够从读取端辨别边界是另一回事.)
{ 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