29

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

$ update-client > my.log

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

4

4 回答 4

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

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

于 2010-07-09T19:07:04.190 回答
7

只需使用 tail 来观察文件的更新。通过在上面的命令之后添加 & 来后台你的原始进程执行上面的命令后,只需使用

$ tail -f my.log

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

于 2010-07-09T19:09:00.720 回答
5

您可以为此使用 tee 命令:

command | tee /path/to/logfile

不写入 shell 的等价物是:

command > /path/to/logfile

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

command | tee -a /path/to/logfile

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

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

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

在 askubuntu 网站上了解这一点

于 2016-02-18T07:54:11.157 回答
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"

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

于 2012-08-15T19:31:12.310 回答