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

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

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

有没有办法将输出重定向到文件,让它显示在标准输出上?

934720 次浏览

您想要的命令名为#0

foo | tee output.file

例如,如果您只关心stdout:

ls -a | tee output.file

如果您想包含stderr,请执行:

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

2>&1将通道2(标准错误/标准错误)重定向到通道1(标准输出/标准输出),以便两者都写入标准输出。从tee命令开始,它也被定向到给定的输出文件。

此外,如果您想在日志文件中使用追加,请使用tee -a作为:

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

使用tail -f output应该有效。

T恤是完美的这但这也将做的工作

ls -lr / > output | cat output
$ program [arguments...] 2>&1 | tee outfile

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

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

问题(特别是当混合stdout和stderr流时)是依赖于程序刷新的流。例如,如果所有对stdout的写入都被没有刷新,但所有对stderr的写入都被刷新,那么它们最终会在输出文件和屏幕上按时间顺序排列。

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

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

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

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

ls -lR / | tee -a output.file

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

<command> |& tee  <outputFile>

gnu bash手册所示

示例:

ls |& tee files.txt

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

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

有东西要补充……

软件包解压器在fedora和redhat unix版本下的某些软件包支持问题。

抛开烦恼

跟踪对我有用

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

谢谢你ScDFmatthew你的投入节省了我很多时间。

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

在您需要作为其他用户执行此操作的情况下

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

请注意,回显将发生在您身上,文件写入将发生在“some_user”中,如果您将回显作为“some_user”运行并使用>>“some_file”重定向输出,那么不是将起作用,因为文件重定向将发生在您身上。

提示:tee还支持使用-a标志追加,如果您需要将文件中的一行替换为另一个用户,您可以以所需用户的身份执行ses。

< command > |& tee filename#这将创建一个文件“文件名”,其中包含命令状态作为内容,如果文件已经存在,它将删除现有内容并写入命令状态。

< command > | tee >> filename#这会将状态附加到文件,但不会在standard_output(屏幕)上打印命令状态。

我想通过在屏幕上使用“回声”打印一些东西,并将回声数据附加到文件中

echo "hi there, Have to print this on screen and append to a file"

您可以通过在脚本开头使用类似的内容来为整个脚本执行此操作:

#!/usr/bin/env bash
test x$1 = x$'\x00' && shift || { set -o pipefail ; ( exec 2>&1 ; $0 $'\x00' "$@" ) | tee mylogfile ; exit $? ; }
# do whaetever you want

这将stderr和stdout输出重定向到名为mylogfile的文件,让所有内容都转到stdout与此同时

它使用了一些愚蠢的技巧:

  • 使用exec不带命令设置重定向,
  • 使用tee复制输出,
  • 使用所需的重定向重新启动脚本,
  • 使用特殊的第一个参数(由$'string'特殊bash符号指定的简单NUL字符)来指定脚本重新启动(您的原始作品不能使用等效参数),
  • 使用pipefail选项重新启动脚本时,请尝试保留原始退出状态。

丑陋,但在某些情况下对我有用。

在我的例子中,我有输出日志的Java过程。显示输出日志并将它们重定向到文件(此处名为logfile)的最简单解决方案是:

my_java_process_run_script.sh |& tee logfile

结果是Java进程运行,输出日志显示和将它们放入名为logfile

的文件中