我试图将所有输出发送到日志,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 之间的顺序丢失;实际上它已经足够接近了。 (有关更多信息,请参阅下面我漫无目的的评论。)