当前位置:  开发笔记 > 编程语言 > 正文

如何将输出重定向到文件和标准输出

如何解决《如何将输出重定向到文件和标准输出》经验,为你挑选了6个好方法。

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

调用foo > output会将该命令的任何输出重定向到指定的文件(在本例中为'output').

有没有办法将输出重定向到文件并将其显示在stdout上?



1> Zoredache..:

您想要的命令命名为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 -aas:

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


如果OP要重定向"all output",你还需要抓住stderr:"ls -lR/2>&1 | tee output.file"
@evanmcdonnal答案没有错,根据您的要求可能不够具体或完整.当然,您可能不希望将stderr作为输出的一部分保存到文件中.当我5年前回答这个问题时,我认为OP只想要stdout,因为他在帖子的主题中提到了stdout.
在`tee`上使用`-a`参数将内容附加到`output.file`,而不是覆盖它:`ls -lR/| tee -a output.file`
如果你之后使用`$?`,它将返回`tee`的状态代码,这可能不是你想要的.相反,你可以使用`$ {PIPESTATUS [0]}`.
对不起,我可能有点困惑.当我尝试它时,我没有输出,也许它都是stderr.

2> Matthew Alpe..:
$ program [arguments...] 2>&1 | tee outfile

2>&1转储stderr和stdout流. tee outfile获取它获取的流并将其写入屏幕和文件"outfile".

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

问题(特别是在混合stdout和stderr流时)是依赖于程序刷新的流.如果,例如,所有的写入stdout都没有刷新,但所有写至标准错误刷新,那么他们最终会出在输出文件中按时间顺序排列,并在屏幕上.

如果程序每隔几分钟只输出1或2行来报告进度,那也很糟糕.在这种情况下,如果程序没有刷新输出,用户甚至不会在屏幕上看到任何数小时的输出,因为它们都不会被推过管道数小时.

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

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


有人知道osx的'unbuffer'吗?
如果您不能使用unbuffer,GNU coreutils包含一个名为[stdbuff]的工具(http://www.gnu.org/software/coreutils/manual/html_node/stdbuf-invocation.html),可用于防止输出缓冲像这样`$ stdbuf -o 0 program [arguments ...] 2>&1 | tee outfile`
注意,`python`有一个内置选项`-u`,用于取消输出缓冲。

3> tsenapathy..:

另一种对我有用的方法是,

 |& tee  

如gnu bash手册中所示

例:

ls |& tee files.txt

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

有关更多信息,请参阅重定向


如果你之后使用`$?`,它将返回`tee`的状态代码,这可能不是你想要的.相反,你可以使用`$ {PIPESTATUS [0]}`.

4> O.Badr..:

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

ls -lR / | tee -a output.file



5> nitinr708..:

要添加的东西......

软件包unbuffer在fedora和redhat unix版本下的某些软件包中存在支持问题.

抛开麻烦

以下为我工作

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

谢谢ScDF&matthew你的输入节省了我很多时间..



6> Chuck Philli..:

使用tail -f output应该工作.

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有