将stdout和stderr重定向到永久文件,但继续打印它们

时间:2017-11-15 08:45:11

标签: bash

通过以下(1):

 exec >> log_file
 exec 2>&1
 ls

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

通过执行以下(2):

command | tee log_file

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

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

2 个答案:

答案 0 :(得分:3)

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

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

基本上你告诉bash将输出({1}}和stdout)发送到stderr的{​​{1}},并且tee正在运行子shell(在括号内),只要你的脚本有效,它就会存在。

将其置于顶部附近,然后将记录任何和所有stdin输出,teecommandecho

这样可以节省必须创建print函数并不断地将命令发送到printf

希望有所帮助!

答案 1 :(得分:1)

使用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

命令在paranthesis中的原因是保持打印的顺序,因为stdout是缓冲的。它导致ll命令在子shell中执行,然后按顺序返回stdout + stderr的输出。