将命令输出重定向到文件和终端

97

我正在尝试将命令输出同时发送到文件和控制台。因为我想在文件中保留输出记录。我正在执行以下操作,它会将输出附加到文件中,但不会在终端中打印ls的输出。

$ls 2>&1 > /tmp/ls.txt
3个回答

147

是的,如果你将输出重定向,它就不会出现在控制台上。使用tee命令。

ls 2>&1 | tee /tmp/ls.txt

3
在这种情况下,错误信息被合并到输出中(2>&1),因此消耗管道的下一个进程将把它们两个都视为常规输入(简而言之:是的)。 - Karoly Horvath
1
我该如何使用tee追加日志? - Satish
9
没关系,我找到了它 --append, -a - Satish
2
如何在上述命令中指定ls.txt文件的大小,以便它不超过给定的大小。一旦超过最大大小,如何在同一目录下创建一个新文件(例如:ls1.txt,ls2.txt...)? - Binay
4
请注意,您将会失去 ls 的退出状态。如果您想保留 ls 的退出状态,或者更准确地说,如果您想确定管道中的某些内容失败了,尽管tee 是管道中的最后一个(也很可能是成功的)命令,您需要使用 set -o pipefail - Christian Hujer
显示剩余3条评论

55

值得一提的是,2>&1 表示标准错误输出将与标准输出一起被重定向。因此,

someCommand | tee someFile

这仅会将标准输出写入文件,但不包括标准错误输出:标准错误输出只会在控制台显示。如果您想要将标准错误输出也写入文件中,可以使用

someCommand 2>&1 | tee someFile

(来源: 在shell中,“2>&1”是什么? )。最后,这两个命令都会截断文件并清空它。如果您使用一系列命令,则可能希望一个接一个地获取所有命令的输出和错误。在这种情况下,您可以使用-a标志来执行“tee”命令:

someCommand 2>&1 | tee -a someFile

22

如果有人需要追加输出而不是覆盖原有内容,可以使用"tee"命令的"-a"或"--append"选项:

ls 2>&1 | tee -a /tmp/ls.txt
ls 2>&1 | tee --append /tmp/ls.txt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接