发布
社区首页 >问答首页 >预挂起然后重定向

预挂起然后重定向
EN

Stack Overflow用户
提问于 2020-03-02 14:57:37
回答 4查看 107关注 0票数 0

我想将stderr重定向到一个用于日志记录的文件:

代码语言:javascript
代码运行次数:0
复制
2>> "$logFile"

如何在每一行前面加上字符串"error: "

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-03-02 15:14:03

您可以使用进程替换。

代码语言:javascript
代码运行次数:0
复制
2> >(awk '{print "error: " $0}' >> "$logfile")

或者使用具有损坏的进程替换支持的旧shell:

代码语言:javascript
代码运行次数:0
复制
{ { prog >&3; } 2>&1 | sed 's/^/error: /' >> "$logfile"; } 3>&1

这里我们将prog的stdout保存到fd3,通过管道将其stderr传递给sed,最后将fd3恢复回stdout。

票数 1
EN

Stack Overflow用户

发布于 2020-03-02 15:43:24

另一个选项是sed

代码语言:javascript
代码运行次数:0
复制
2> >(sed -u 's/^/error: /' >> "$logfile")

只使用bash内置可能是不可能的,因为这种为字符串添加前缀的机制需要与流一起使用。

注使用gnu sed option -u (--unbuffered)从输入文件加载最少量的数据,并更频繁地刷新输出缓冲区。

Code Demo

票数 2
EN

Stack Overflow用户

发布于 2020-03-02 15:54:31

一个纯Bash版本:

代码语言:javascript
代码运行次数:0
复制
2> >(while read -r line ; do echo "error: $line" ; done >> "$logFile")

..。..。..。但请注意,如果程序写入任何空字节,或者如果程序没有在最后一行之后写入换行符,这将是错误的。(这两个问题都是可以解决的,但在某种程度上,我们不得不质疑仅仅是为了避免调用awk或sed是否值得。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60483901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档