bash - 将输出写入日志文件和控制台

标签 bash shell redirect logging

在 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/

相关文章:

linux - 使用 Bash 计算并打印两个日期之间的差异?

macos - Bash 别名 : command not found

linux - 仅使用 bash 脚本陷阱提取文件 5 次

linux - 为什么flock会从文件中删除现有文本?

c - 在 c 中实现子 shell

linux - 如何列出文件夹中的所有文件夹并排除特定文件夹

javascript - 如何在同一服务器上动态更改页面而无需空闲时间?

python - 如何更改 shell 脚本的工作目录(这里是新手)

javascript - 使用 JS 在 URL #fragment 丢失到 301 重定向之前转换它?

php - 是否可以重定向到新地址而不是显示 404 错误页面?