如何将输出重定向到文件和标准输出流

27 浏览
0 Comments

如何将输出重定向到文件和标准输出流

在Bash中,调用foo会将该命令的任何输出显示在stdout上。

调用foo>输出会将该命令的任何输出重定向到指定的文件(在本例中为“输出”)。

有没有一种方法可以将输出重定向到文件并在stdout上显示?

admin 更改状态以发布 2023年5月23日
0
0 Comments

$ program [arguments...] 2>&1 | tee outfile

2>&1 将标准错误和标准输出流一起输出。
tee outfile 接收到的流将会被写入屏幕和文件 "outfile"。

这可能是大多数人寻找的功能。通常情况下,某个程序或脚本正在长时间地工作并产生大量输出。用户想要定期检查进度,但同时也希望将输出写入文件。

问题在于,这取决于程序是否将流刷新。特别是在混合标准输出和标准错误流的情况下,如果所有的标准输出写入没有被刷新,而所有的标准错误写入被刷新了,那么它们将会以不按时间顺序的方式出现在输出文件和屏幕上。

如果程序每隔几分钟才输出1或2行报告进度,也会是一个问题。在这种情况下,如果程序没有刷新输出,那么用户在几个小时内甚至看不到屏幕上的任何输出,因为在几个小时内没有输出会被推送到管道中。

更新:程序 unbufferexpect 包的一部分,它可以解决缓冲问题。这将导致标准输出和标准错误立即写入屏幕和文件,并在合并和重定向到 tee 时保持同步。例如:

$ unbuffer program [arguments...] 2>&1 | tee outfile

0
0 Comments

你需要的命令名为tee:

foo | tee output.file

例如,如果你只关心标准输出(stdout):

ls -a | tee output.file

如果你想包含标准错误(stderr),则执行如下操作:

program [arguments...] 2>&1 | tee outfile

2>&1 将通道2(stderr/标准错误) 重定向到通道1(stdout/标准输出),使得两个通道都被写入stdout,同时也被写入到给定的输出文件作为 tee 命令的一部分。

此外,如果你想追加到日志文件中,使用 tee -a 命令:

program [arguments...] 2>&1 | tee -a outfile

0