通过以下(1):
exec >> log_file
exec 2>&1
ls
stdout
和stderr
将永久重定向到下一个命令,但不再显示在终端上。此处,ls
输出将在log_file
中,但不会显示在终端
通过执行以下(2):
command | tee log_file
command
输出将在log_file
中并打印在终端上,但这仅适用于command
,而不适用于方法1的下一个命令。
如何将永久stdout
和stderr
输出重定向到给定终端的文件,如方法1,并在终端实例上打印stdout
和stderr
,如方法2?
答案 0 :(得分:3)
我目前在我的脚本中使用它:
exec > >(tee -a "${FILE_Log}" )
exec 2> >(tee -a "${FILE_Log}" >&2)
基本上你告诉bash将输出({1}}和stdout
)发送到stderr
的{{1}},并且tee
正在运行子shell(在括号内),只要你的脚本有效,它就会存在。
将其置于顶部附近,然后将记录任何和所有stdin
输出,tee
,command
和echo
。
这样可以节省必须创建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的输出。