如何将输出redirect到文件和标准输出

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

调用foo > output会将该命令的foo > outputredirect到指定的文件(在本例中为“output”)。

有没有办法将输出redirect到一个文件并显示在标准输出?

你想要的命令叫做tee

 foo | tee output.file 

例如,如果你只关心stdout:

 ls -a | tee output.file 

如果你想包括标准错误,做:

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

2>&1将通道2(标准错误/标准错误)redirect到通道1(标准输出/标准输出),使得两者都写为标准输出。 它也是针对tee命令的给定输出文件。

而且,如果你想附加到日志文件,使用tee -a

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

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

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

这个问题(特别是混合标准输出和标准错误码stream时)是依赖程序刷新的stream。 例如,如果对stdout的所有写操作都没有刷新,但是所有对stderr的写操作都被刷新了,那么它们将在输出文件和屏幕上以时间顺序结束。

如果程序每隔几分钟只输出1或2行来报告进度,那也是不好的。 在这种情况下,如果输出没有被程序清除,用户甚至不会在屏幕上看到任何输出几个小时,因为没有任何输出会被推送通过pipe道几个小时。

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

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

另一种适用于我的方法是,

 <command> |& tee <outputFile> 

如gnu bash手册所示

例:

 ls |& tee files.txt 

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

有关更多信息,请参阅redirect

tee是你的朋友。

 whatever | tee logfile.txt 

您可以主要使用Zoredache 解决scheme ,但是如果您不想覆盖输出文件,则应该使用-a选项来编写tee,如下所示:

 ls -lR / | tee -a output.file 

有东西要添加…

package unbuffer在fedora和redhat unix版本下有一些软件包的支持问题。

抛开麻烦

以下为我工作

 bash myscript.sh 2>&1 | tee output.log 

谢谢ScDF & matthew你的input为我节省了很多时间..

使用tail -f output应该工作。

奖金的答案,因为这个用例把我带到这里:

在这种情况下,你需要像其他一些用户那样做

 echo "some output" | sudo -u some_user tee /some/path/some_file 

请注意,回声将发生在您和文件写入将发生作为“some_user”不起作用的是,如果你运行回声作为“some_user”和redirect与>>“some_file”的输出,因为文件redirect将发生和你一样。

提示:tee还支持使用-a标志附加,如果需要将文件中的行replace为另一个用户,则可以执行sed作为所需的用户。

T恤是完美的,但这也将完成这项工作

 ls -lr / > output | cat output