2

我想做以下事情;

  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)并且日志仍然缓冲。建议?

4

1 回答 1

2

这对你有用吗?

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

command你的命令在哪里。

于 2012-11-16T07:12:10.867 回答