在bash中,调用foo将在stdout上显示该命令的所有输出。
调用foo > output会将该命令的所有输出重定向到指定的文件(在本例中为“ output”)。
有没有一种方法可以将输出重定向到文件并在stdout上显示?
#1楼
您可以主要使用Zoredache 解决方案 ,但是如果您不想覆盖输出文件,则应使用-a选项编写tee,如下所示:
ls -lR / | tee -a output.file
#2楼
对我有用的另一种方法是
|& tee
例:
ls |& tee files.txt
如果使用'|&',则command1的标准错误 (除了其标准输出 )还通过管道连接到command2的标准输入; 它是2>&1 |的简写 。 将标准错误隐式重定向到标准输出是在命令指定的任何重定向之后执行的。
有关更多信息,请参考重定向
#3楼
补充一下...
软件包解缓冲在fedora和redhat UNIX发行版中对某些软件包有支持问题。
排除烦恼
以下对我有用
bash myscript.sh 2>&1 | tee output.log
谢谢ScDF和马修,您的输入为我节省了很多时间。
#4楼
奖励答案,因为此用例将我带到了这里:
如果您需要以其他用户身份执行此操作
echo "some output" | sudo -u some_user tee /some/path/some_file
请注意,回声会发生在你和文件写入会发生的“some_user”究竟会不会工作,如果你要运行回声为“some_user”,并与输出重定向>>“SOME_FILE”,因为文件重定向会发生和你一样
提示:tee还支持带有-a标志的append,如果您需要以其他用户的身份替换文件中的一行,则可以以所需用户的身份执行sed。
#5楼
您想要的命令名为
foo | tee output.file
例如,如果您只关心标准输出:
ls -a | tee output.file
如果要包括stderr,请执行以下操作:
program [arguments...] 2>&1 | tee outfile
2>&1将通道2(stderr /标准错误)重定向到通道1(stdout /标准输出),以便将两者都写为stdout。 从tee命令开始,它也被定向到给定的输出文件。
此外,如果要追加到日志文件,请使用tee -a作为:
program [arguments...] 2>&1 | tee -a outfile