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

Kri*_*ves 22 linux bash logging stdout stderr

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

$ update-client > my.log
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*hen 41

update-client 2>&1 | tee my.log
Run Code Online (Sandbox Code Playgroud)

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


Anu*_*ain 7

您可以使用 tee 命令来实现:

command | tee /path/to/logfile
Run Code Online (Sandbox Code Playgroud)

不写入 shell 的等效内容是:

command > /path/to/logfile
Run Code Online (Sandbox Code Playgroud)

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

command | tee -a /path/to/logfile
Run Code Online (Sandbox Code Playgroud)

请注意,管道将仅捕获 stdout,带有 tee 的管道不会处理 stderr 错误。如果您想记录错误(来自 stderr),请使用:

command 2>&1 | tee /path/to/logfile
Run Code Online (Sandbox Code Playgroud)

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

请访问 askubuntu 网站了解更多信息


Cfr*_*eak 5

只需使用 tail 在文件更新时查看文件即可。通过在上面的命令之后添加 & 来背景你的原始进程执行上面的命令后,只需使用

$ tail -f my.log
Run Code Online (Sandbox Code Playgroud)

它将不断更新。(请注意,它不会告诉您文件何时完成运行,因此您可以向日志输出一些内容以告诉您它已完成。Ctrl-c 退出 tail)

  • 哇,这个人很难受。这个答案到底有什么问题? (2认同)
  • 在我看来,这比使用“tee”要糟糕数千倍。 (2认同)