我想将stderr
重定向到一个用于日志记录的文件:
2>> "$logFile"
如何在每一行前面加上字符串"error: "
?
发布于 2020-03-02 15:14:03
您可以使用进程替换。
2> >(awk '{print "error: " $0}' >> "$logfile")
或者使用具有损坏的进程替换支持的旧shell:
{ { prog >&3; } 2>&1 | sed 's/^/error: /' >> "$logfile"; } 3>&1
这里我们将prog
的stdout保存到fd3,通过管道将其stderr传递给sed,最后将fd3恢复回stdout。
发布于 2020-03-02 15:43:24
另一个选项是sed
2> >(sed -u 's/^/error: /' >> "$logfile")
只使用bash内置可能是不可能的,因为这种为字符串添加前缀的机制需要与流一起使用。
注使用gnu sed
option -u
(--unbuffered
)从输入文件加载最少量的数据,并更频繁地刷新输出缓冲区。
发布于 2020-03-02 15:54:31
一个纯Bash版本:
2> >(while read -r line ; do echo "error: $line" ; done >> "$logFile")
..。..。..。但请注意,如果程序写入任何空字节,或者如果程序没有在最后一行之后写入换行符,这将是错误的。(这两个问题都是可以解决的,但在某种程度上,我们不得不质疑仅仅是为了避免调用awk或sed是否值得。)
https://stackoverflow.com/questions/60483901
复制相似问题