如何在bash中记录输出并同时在终端中查看?

时间:2010-07-09 19:04:03

标签: linux bash logging stdout stderr

我有一些脚本需要查看输出将结果记录到文件中,最简单的示例是:

$ update-client > my.log

我希望能够在命令运行时看到该命令的输出,但也将其记录到该文件中。我也记录stderr,所以我希望能够在看到它时记录错误流。

4 个答案:

答案 0 :(得分:39)

update-client 2>&1 | tee my.log

2>& 1将标准错误重定向到标准输出,并且tee将其标准输入发送到标准输出和文件。

答案 1 :(得分:4)

只需使用tail来查看文件,因为它已更新。通过添加&在您的上述命令之后执行上述命令后,只需使用

$ tail -f my.log

它会不断更新。 (注意它不会告诉你文件什么时候运行完毕所以你可以输出一些东西到日志告诉你它已经完成了.Ctrl-c退出尾部)

答案 2 :(得分:4)

另一种选择是在脚本中使用基于块的输出捕获(不确定这是否是正确的技术术语)。

实施例

#!/bin/bash 
{
  echo "I will be sent to screen and file"
  ls ~
} 2>&1 | tee -a /tmp/logfile.log

echo "I will be sent to just terminal"

我喜欢有更多的控制和灵活性 - 所以我更喜欢这种方式。

答案 3 :(得分:2)

您可以使用tee命令:

command | tee /path/to/logfile

没有写入shell的equivelent将是:

command > /path/to/logfile

如果要追加(>>)并在shell中显示输出,请使用-a选项:

command | tee -a /path/to/logfile

请注意,管道只会捕获标准输出,并且带有三通的管道不会处理stderr的错误。如果要记录错误(来自stderr),请使用:

command 2>&1 | tee /path/to/logfile

这意味着:运行命令并将stderr流(2)重定向到stdout(1)。这将通过T恤应用程序传递给管道。

在askubuntu网站了解此事