协慌网

登录 贡献 社区

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

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

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

有没有办法将输出重定向到文件并将其显示在 stdout 上?

答案

您想要的命令名为tee

foo | tee output.file

例如,如果你只关心 stdout:

ls -a | tee output.file

如果要包含 stderr,请执行以下操作:

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

2>&1将通道 2(stderr / 标准错误)重定向到通道 1(标准输出 / 标准输出),这样两者都写为标准输出。它也指向tee命令的给定输出文件。

此外,如果要附加到日志文件,请使用tee -a作为:

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

2>&1转储 stderr 和 stdout 流。 tee outfile获取它获取的流并将其写入屏幕和文件 “outfile”。

这可能是大多数人都在寻找的。可能的情况是某些程序或脚本长时间努力并产生大量输出。用户希望定期检查进度,但也希望将输出写入文件。

问题(特别是在混合 stdout 和 stderr 流时)是依赖于程序刷新的流。如果,例如,所有的写入 stdout 不会被刷新,但所有写至标准错误刷新,那么他们最终会出在输出文件中按时间顺序排列,并在屏幕上。

如果程序每隔几分钟只输出 1 或 2 行来报告进度,那也很糟糕。在这种情况下,如果程序没有刷新输出,用户甚至不会在屏幕上看到任何数小时的输出,因为它们都不会被推过管道数小时。

更新:程序unbufferexpect包的一部分,将解决缓冲问题。这将导致 stdout 和 stderr 立即写入屏幕和文件,并在组合并重定向到tee时保持同步。例如:

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

另一种对我有用的方法是,

<command> |& tee  <outputFile>

gnu bash 手册中所示

例:

ls |& tee files.txt

如果使用 '|&',则 command1 的标准错误除了标准输出外 ,还通过管道连接到 command2 的标准输入; 它是2>&1 | 的简写 。标准错误到标准输出的隐式重定向是在命令指定的任何重定向之后执行的。

有关更多信息,请参阅重定向