如何将输出redirect到文件和标准输出
在bash中,调用foo
将在stdout上显示该命令的任何输出。
调用foo > output
会将该命令的foo > output
redirect到指定的文件(在本例中为“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道几个小时。
更新:程序unbuffer
, expect
包的一部分,将解决缓冲问题。 这将导致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