在Unix shell中,我有一个env文件(env文件定义运行用户脚本所需的参数,如日志文件名和路径,重定向输出和错误到日志文件,数据库连接详细信息等),它重定向所有输出)和错误从执行脚本日志文件使用以下代码:
exec 1>>${LOG_FILE} exec 2>>${LOG_FILE}
env文件在每个脚本的开头执行。由于env文件中的上述代码,可能是用户输出或错误的所有控制台输出都直接输出到日志文件,这是我实际需要的。
但有一些选择性用户输出,我想在控制台和日志文件中显示。但是因为上面的代码我不能这样做。
我知道,如果我删除上面的代码,我可以得到所需的结果,这种情况下,但我必须手动写入所有其他输出到日志文件,这不是一个容易的任务。
exec 3>&1 1>>${LOG_FILE} 2>&1
会将stdout和stderr输出发送到日志文件中,但也会让你用fd 3连接到控制台,所以你可以做
echo "Some console message" 1>&3
只是向控制台写入消息,或
echo "Some console and log file message" | tee /dev/fd/3
向控制台和日志文件写入消息 – tee将其输出发送到自己的fd 1(这里是LOG_FILE)和您要求写入的文件(这里是fd 3,即控制台) 。
例:
exec 3>&1 1>>${LOG_FILE} 2>&1 echo "This is stdout" echo "This is stderr" 1>&2 echo "This is the console (fd 3)" 1>&3 echo "This is both the log and the console" | tee /dev/fd/3
将打印
This is the console (fd 3) This is both the log and the console
在控制台和放
This is stdout This is stderr This is both the log and the console
进入日志文件。