将标准输出和标准删除到文件永久,但继续打印它们



通过执行以下操作(1(:

 exec >> log_file
 exec 2>&1
 ls

stdoutstderr被永久重定向到下一个命令,但不再显示在终端上。在这里,ls输出将以log_file显示,但不显示在终端中

通过执行以下操作(2(:

command | tee log_file

command输出将以log_file形式打印在终端上,但这仅适用于command,而不适用于作为方法 1 的下一个命令。

如何像方法 1 一样在给定终端的文件中永久重定向stdoutstderr输出,并像方法 2 一样在终端实例上打印stdoutstderr

我目前在我的脚本中使用它:

exec > >(tee -a "${FILE_Log}" )
exec 2> >(tee -a "${FILE_Log}" >&2)

基本上你告诉bash将输出(stdoutstderr(发送到teestdin,并且由于tee在子shell中运行(在括号内(,它将像你的脚本一样存在。

将其放在顶部附近的某个位置,然后记录任何和所有command输出,echoprintprintf

这样就不必创建LOG()函数并不断通过管道命令来tee

希望对您有所帮助!

结合使用tee和重定向:

(exec 2>&1) | tee file.txt

下面是一个示例

[root@box ~]# (ll 2>&1) | tee tmp.txt
total 4
-rw-------. 1 root root 1007 Apr 26  2017 anaconda-ks.cfg
[root@box ~]# cat tmp.txt
total 4
-rw-------. 1 root root 1007 Apr 26  2017 anaconda-ks.cfg

该命令位于偏执状态中的原因是保持打印的顺序,因为 stdout 是缓冲的。它使ll命令在子 shell 中执行,然后按顺序返回 stdout + stderr 的输出。

最新更新