用于日志的 stdout、用于日志和控制台的 stderr

用于日志的 stdout、用于日志和控制台的 stderr

我试图将所有输出发送到日志,stderr 也显示在控制台中。

..按顺序记录日志条目,并使用某种方法将注释发送到日志+控制台(与 stderr 相同)。

exec &> log

例如,这是行不通的:

#!/bin/bash

exec 2> >(tee log) 2>&1 > build.log

echo "Yes 1"
ugh "No 1"
echo "Yes 2"
ugh "No 2"
echo "Message to user" 3>&1

我在这里和其他地方找到的示例要么使它们乱序,要么重定向到日志和控制台。

这些示例都没有将所有输出发送到日志 - stderr 和“特殊消息”也显示在屏幕上......


解决方案

克里斯在下面的回答中解决了这个问题。这是经过调整的解决方案:

#!/bin/bash

exec 3> >(tee -a log)
exec 4>>log
exec >&4 2>&3

# Out: To log.
echo "I'm standard output."

# Error: To log and console.
ugh "command not found"

# Message: To log and console.
echo "Message to user." >&3

这将按照给定注释的建议将其写入日志/控制台。

答案1

我假设这是在脚本中完成的?如果是这样,我想这应该可以满足您的要求。stdout将仅发送至out.txt.stderr将被发送到控制台并发送到err.txt

#!/bin/bash
exec 3> >(tee ./err.txt)
exec 4>./out.txt
exec >&4 2>&3

echo "I'm normal text!"    # only in out.txt
echo "I'm an error!" >&2   # in err.txt and on console

编辑:我对这个小剧本感到非常满意,但我不太清楚为什么。

编辑2:要将两个流写入同一个文件,只需在两个地方使用相同的文件名即可。理论上,这很少会导致 stdout 和 stderr 之间的顺序丢失;实际上它已经足够接近了。 (有关更多信息,请参阅下面我漫无目的的评论。)

答案2

您可以交换 stdout 和 stderr 流。看这个例子:

ps aux 3>&1 1>&2 2>&3 | grep init

查看这个链接了解更多详情。

相关内容