将一个 bash 行重定向到 stdout/terminal vs log

将一个 bash 行重定向到 stdout/terminal vs log

我有一个 bash 脚本,其中我将输出重定向到文件进行记录。

if test -t 1; then
    # stdout is a terminal
    exec > $OUTPUT_FILE 2>&1
else
    # stdout is not a terminal, no logging.
    false     
fi 

稍后我有一个地方确实需要将输出发送到 stdout。有没有办法只覆盖一个调用来强制执行该操作?

echo test 1>

答案1

您可以在脚本的较早位置放置此行:

exec 3>&1

然后,每当您需要发送某些内容到标准输出时:

echo "this goes to stdout" 1>&3

清理:

exec 1>&3
echo "now goes to normal stdout"
exec 3>&-  #to remove fd3

它的工作原理是,您定义一个新的文件描述符 3,它指向与 stdout 相同的位置。然后,您可以根据需要重定向 stdout,但 fd3 保持不变(即您的终端)。完成后,只需删除 fd3 即可!

编辑:

如果您希望输出同时转到您的文件和“经典标准输出”,请执行以下操作:

echo "goes both places" | tee -a $OUTPUT_FILE 1>&3

相关内容