如何在bash中logging输出并同时在terminal中看到它?

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

$ update-client > my.log 

我希望能够在运行时看到命令的输出,但也要将其logging到文件中。 我也loggingstderr ,所以我希望能够在看到它的同时logging错误stream。

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

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

只要使用尾巴来观看文件更新。 通过在上面的命令之后添加&来完成原始的过程。在执行上面的命令之后,只需使用

 $ tail -f my.log 

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

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

 #!/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" 

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

你可以使用tee命令:

 command | tee /path/to/logfile 

没有写入shell的同等性将是:

 command > /path/to/logfile 

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

 command | tee -a /path/to/logfile 

请注意,管道只会捕捉stdout,到stderr的错误不会被三通管道处理。 如果你想记录错误(从stderr),使用:

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

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

在askubuntu网站了解这一点