2012-11-16 58 views
2

我想要做以下;Bash - 重定向stdout登录和屏幕stderr只有日志

  1. 将stdout的副本重定向到日志文件并在屏幕上保留stdout。
  2. 将stderr重定向到相同的日志文件并且不显示在屏幕上。

没有标准输出代码筛选

#!/bin/bash 
exec 1> >(sed -u 's/^/INF: /' >> common.log) 
exec 2> >(sed -u 's/^/ERR: /' >> common.log) 
echo "some txt" 
echo "an error" >&2 
echo "some more txt" 
echo "one more error" >&2 

日志

INF: some txt 
INF: some more txt 
ERR: an error 
ERR: one more error 

第一个问题是缓冲,我试图用sed的 '-u' 无缓冲的否定。

代码标准输出到屏幕:在屏幕挂

#!/bin/bash 
exec 1> >(sed -u 's/^/INF: /' | tee -a common.log) 
exec 2> >(sed -u 's/^/ERR: /' >> common.log) 
echo "some txt" 
echo "an error" >&2 
echo "some more txt" 
echo "one more error" >&2 

结果(不得不按Ctrl-C)和日志仍然缓冲。建议?

回答

2

这是否适合您?

command 2> >(sed -u 's/^/ERR: /' >> common.log) | sed -u 's/^/INF: /' | tee -a common.log 

其中command是你的命令。

+0

对于给定的命令是的,但我希望整个命名空间因此使用exec。我可以在{}或函数本身中封装特定的部分,并使用您的解决方案,但这并不理想。 – koola

+0

鉴于没有更好的选择,我将此标记为答案。 – koola

相关问题