如何将输出重定向到文件和stdout
在bash中,调用foo
会在stdout上显示该命令的任何输出。
调用foo > output
会将该命令的foo > output
重定向到指定的文件(在本例中为'output')。
有没有办法将输出重定向到文件并将其显示在标准输出上?
你想要的命令被命名为tee
:
foo | tee output.file
例如,如果你只关心标准输出:
ls -a | tee output.file
如果你想包括标准错误,做:
program [arguments...] 2>&1 | tee outfile
2>&1
将通道2(标准错误/标准错误)重定向到通道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流时)是依赖于程序刷新的流。 例如,如果所有对标准输出的写入都没有刷新,但是所有对标准错误的写入都刷新了,那么它们将以输出文件和屏幕上的时间顺序结束。
如果程序每隔几分钟只输出1或2行来报告进度,那也是不好的。 在这种情况下,如果程序没有清除输出,用户甚至几个小时都不会在屏幕上看到任何输出,因为没有任何输出会在数小时内通过管道。
更新:程序unbuffer
是expect
包的一部分,将解决缓冲问题。 这会导致stdout和stderr立即写入屏幕和文件,并在组合并重定向到tee
时保持同步。 例如:
$ unbuffer program [arguments...] 2>&1 | tee outfile
另一种适用于我的方法是,
<command> |& tee <outputFile>
如gnu bash手册所示
例:
ls |& tee files.txt
如果使用'&',则除标准输出外,command1的标准错误通过管道连接到command2的标准输入; 它是2>&1 |的简写 。 标准错误隐式重定向到标准输出是在命令指定的任何重定向之后执行的。
有关更多信息,请参阅重定向
链接地址: http://www.djcxy.com/p/19175.html