Zor*_*che 1234
您想要的命令命名为tee:
foo | tee output.file
Run Code Online (Sandbox Code Playgroud)
例如,如果你只关心stdout:
ls -a | tee output.file
Run Code Online (Sandbox Code Playgroud)
如果要包含stderr,请执行以下操作:
program [arguments...] 2>&1 | tee outfile
Run Code Online (Sandbox Code Playgroud)
2>&1将通道2(stderr /标准错误)重定向到通道1(标准输出/标准输出),这样两者都写为标准输出.它也指向命令的给定输出文件tee.
此外,如果要附加到日志文件,请使用tee -aas:
program [arguments...] 2>&1 | tee -a outfile
Run Code Online (Sandbox Code Playgroud)
Mat*_*ert 485
$ program [arguments...] 2>&1 | tee outfile
Run Code Online (Sandbox Code Playgroud)
2>&1转储stderr和stdout流.
tee outfile获取它获取的流并将其写入屏幕和文件"outfile".
这可能是大多数人都在寻找的.可能的情况是某些程序或脚本长时间努力并产生大量输出.用户希望定期检查进度,但也希望将输出写入文件.
问题(特别是在混合stdout和stderr流时)是依赖于程序刷新的流.如果,例如,所有的写入stdout都没有刷新,但所有写至标准错误被刷新,那么他们最终会出在输出文件中按时间顺序排列,并在屏幕上.
如果程序每隔几分钟只输出1或2行来报告进度,那也很糟糕.在这种情况下,如果程序没有刷新输出,用户甚至不会在屏幕上看到任何数小时的输出,因为它们都不会被推过管道数小时.
更新:该程序unbuffer是expect程序包的一部分,将解决缓冲问题.这将导致stdout和stderr立即写入屏幕和文件,并在组合和重定向到时保持同步tee.例如:
$ unbuffer program [arguments...] 2>&1 | tee outfile
Run Code Online (Sandbox Code Playgroud)
tse*_*thy 118
另一种对我有用的方法是,
<command> |& tee <outputFile>
Run Code Online (Sandbox Code Playgroud)
如gnu bash手册中所示
例:
ls |& tee files.txt
Run Code Online (Sandbox Code Playgroud)
如果使用'|&',则command1的标准错误除了标准输出外,还通过管道连接到command2的标准输入; 它是2>&1 |的简写.标准错误到标准输出的隐式重定向是在命令指定的任何重定向之后执行的.
有关更多信息,请参阅重定向
Jac*_*bec 17
就我而言,我有带有输出日志的 Java 进程。显示输出日志并将其重定向到文件(此处名为 logfile)的最简单解决方案是:
my_java_process_run_script.sh |& tee logfile
Run Code Online (Sandbox Code Playgroud)
结果是 Java 进程运行并显示输出日志并将其放入名为 logfile 的文件中
O.B*_*adr 16
您可以主要使用Zoredache 解决方案,但如果您不想覆盖输出文件,则应使用-a选项编写tee,如下所示:
ls -lR / | tee -a output.file
Run Code Online (Sandbox Code Playgroud)
nit*_*708 11
要添加的东西......
软件包unbuffer在fedora和redhat unix版本下的某些软件包中存在支持问题.
抛开麻烦
以下为我工作
bash myscript.sh 2>&1 | tee output.log
Run Code Online (Sandbox Code Playgroud)
自从这个用例把我带到这里以来,额外的答案是:
如果您需要以其他用户身份执行此操作
echo "some output" | sudo -u some_user tee -a /some/path/some_file
Run Code Online (Sandbox Code Playgroud)
请注意,回显将在您进行时发生,并且文件写入将以“some_user”身份发生,但如果您以“some_user”身份运行回显并使用>>“some_file”重定向输出,则不会起作用,因为文件重定向将会发生和你一样。
提示:tee 还支持使用 -a 标志附加,如果您需要以另一个用户身份替换文件中的行,您可以以所需用户身份执行 sed。
您可以通过在脚本开头使用类似的内容来为整个脚本执行此操作:
#!/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
Run Code Online (Sandbox Code Playgroud)
这两种重定向标准错误和标准输出输出到文件称为mylogfile 并且让一切都到stdout在同一时间。
它使用了一些愚蠢的技巧:
exec不带命令来设置重定向,tee复制输出,NUL由$'string'特殊 bash 符号指定的简单字符)来指定重新启动脚本(您的原始作品可能不会使用等效参数),pipefail选项重新启动脚本时,尝试保留原始退出状态。丑陋但在某些情况下对我有用。