在 bash 中,调用 foo
会在标准输出上显示该命令的任何输出。
调用 foo > output
会将来自该命令的任何输出重定向到指定的文件(在本例中为“输出”)。
有没有办法将输出重定向到文件 并 显示在标准输出上?
原文由 SCdF 发布,翻译遵循 CC BY-SA 4.0 许可协议
$ program [arguments...] 2>&1 | tee outfile
2>&1
转储标准错误和标准输出流。 tee outfile
获取它获取的流并将其写入屏幕和文件“outfile”。
这可能是大多数人正在寻找的。可能的情况是某些程序或脚本长时间工作并产生大量输出。用户希望定期检查进度,但也希望将输出写入文件。
问题(尤其是在混合 stdout 和 stderr 流时)是依赖于程序刷新的流。例如,如果对 stdout 的所有写入都 没有 刷新,但对 stderr 的所有写入 都被 刷新,那么它们最终会在输出文件和屏幕上不按时间顺序排列。
如果程序每隔几分钟只输出 1 或 2 行来报告进度,这也很糟糕。在这种情况下,如果程序没有刷新输出,用户甚至在几个小时内都不会在屏幕上看到任何输出,因为在几个小时内它都不会通过管道推送。
更新:程序 unbuffer
是 expect
包的一部分,将解决缓冲问题。这将导致 stdout 和 stderr 立即写入屏幕和文件,并在合并并重定向到 tee
时使它们保持同步。例如:
$ unbuffer program [arguments...] 2>&1 | tee outfile
原文由 Matthew Alpert 发布,翻译遵循 CC BY-SA 3.0 许可协议
6 回答3.5k 阅读
2 回答3.4k 阅读✓ 已解决
4 回答2.1k 阅读
1 回答1.2k 阅读✓ 已解决
2 回答836 阅读✓ 已解决
2 回答1.3k 阅读
1 回答1.6k 阅读✓ 已解决
您想要的命令名为
tee
:例如,如果您只关心标准输出:
如果要包含 stderr,请执行以下操作:
2>&1
将通道 2(stderr/标准错误)重定向到通道 1(stdout/标准输出),这样两者都写为标准输出。从tee
命令开始,它也被定向到给定的输出文件。此外,如果要 附加 到日志文件,请使用
tee -a
作为: