2012-11-16 2 views
2

다음을 수행하고 싶습니다.Bash - stdout을 로그로 리디렉션하고 stderr 만 로그로 기록하십시오.

  1. stdout 복사본을 로그 파일로 리디렉션하고 화면에 stdout을 유지합니다.
  2. 표준 오류를 동일한 로그 파일로 리디렉션하고 화면에 표시하지 않습니다. 표준 출력없이

코드 화면합니다 :

#!/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 

첫 번째 문제는 내가 나오지도 '-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

관련 문제