在 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
进入日志文件。
关于bash - 将输出写入日志文件和控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18460186/