在bash中,调用foo将在stdout上显示该命令的任何输出。
调用foo>output会将该命令的任何输出重定向到指定的文件(在本例中为“output”)。
是否有方法将输出重定向到文件并将其显示在stdout上?
在bash中,调用foo将在stdout上显示该命令的任何输出。
调用foo>output会将该命令的任何输出重定向到指定的文件(在本例中为“output”)。
是否有方法将输出重定向到文件并将其显示在stdout上?
当前回答
$ program [arguments...] 2>&1 | tee outfile
2> &1转储stderr和stdout流。tee-outfile获取获取的流并将其写入屏幕和文件“outfile”。
这可能是大多数人都在寻找的。可能的情况是某些程序或脚本正在长时间努力工作并产生大量输出。用户希望定期检查进度,但也希望将输出写入文件。
问题(特别是当混合stdout和stderr流时)是依赖于程序刷新的流。例如,如果对stdout的所有写入都未刷新,但对stderr的所有写入均已刷新,那么它们将在输出文件和屏幕上按时间顺序结束。
如果程序每隔几分钟只输出1或2行来报告进度,这也很糟糕。在这种情况下,如果输出没有被程序刷新,那么用户甚至在数小时内都不会在屏幕上看到任何输出,因为这些输出都不会在数小时之内被推过管道。
更新:作为expect包的一部分,程序解包将解决缓冲问题。这将导致stdout和stderr立即写入屏幕和文件,并在合并并重定向到tee时保持同步。例如。:
$ unbuffer program [arguments...] 2>&1 | tee outfile
其他回答
您可以主要使用Zoredache解决方案,但如果不想覆盖输出文件,则应使用-a选项编写tee,如下所示:
ls -lR / | tee -a output.file
要添加的内容。。。
在fedora和redhat unix版本下,软件包的非缓冲区对某些软件包存在支持问题。
抛开烦恼
跟踪对我有用
bash myscript.sh 2>&1 | tee output.log
谢谢ScDF和matthew,您的输入为我节省了大量时间。。
使用tail-f输出应该有效。
在我的例子中,我有一个带有输出日志的Java进程。显示输出日志并将其重定向到文件(此处命名为logfile)的最简单解决方案是:
my_java_process_run_script.sh |& tee logfile
结果是Java进程正在运行,输出日志显示和将它们放入名为logfile的文件中
另一种对我有效的方式是,
<command> |& tee <outputFile>
如gnubash手册所示
例子:
ls |& tee files.txt
如果使用“|&”,则command1的标准错误除了其标准输出外,还通过管道连接到command2的标准输入;这是2>&1|的简写。将标准错误隐式重定向到标准输出是在命令指定的任何重定向之后执行的。
有关详细信息,请参阅重定向