在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
as:
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行来报告进度,那也很糟糕.在这种情况下,如果程序没有刷新输出,用户甚至不会在屏幕上看到任何数小时的输出,因为它们都不会被推过管道数小时.
更新:该程序unbuffer
是expect
程序包的一部分,将解决缓冲问题.这将导致stdout和stderr立即写入屏幕和文件,并在组合和重定向到时保持同步tee
.例如:
$ unbuffer program [arguments...] 2>&1 | tee outfile
另一种对我有用的方法是,
|& tee
如gnu bash手册中所示
例:
ls |& tee files.txt
如果使用'|&',则command1的标准错误除了标准输出外,还通过管道连接到command2的标准输入; 它是2>&1 |的简写.标准错误到标准输出的隐式重定向是在命令指定的任何重定向之后执行的.
有关更多信息,请参阅重定向
您可以主要使用Zoredache 解决方案,但如果您不想覆盖输出文件,则应使用-a选项编写tee,如下所示:
ls -lR / | tee -a output.file
要添加的东西......
软件包unbuffer在fedora和redhat unix版本下的某些软件包中存在支持问题.
抛开麻烦
以下为我工作
bash myscript.sh 2>&1 | tee output.log
谢谢ScDF&matthew你的输入节省了我很多时间..
使用tail -f output
应该工作.