스크립트 명령을 사용한 선택적 stdout, stderr 및 로깅

스크립트 명령을 사용한 선택적 stdout, stderr 및 로깅

중복 가능성:
화면에 stderr만 표시하고 stdout 및 stderr을 파일에 씁니다.
stdout, stderr 및 로깅에 스크립트 명령 사용

cattest.sh:

rm -v foo.tmp
date
pwd

cattest2.sh:

script bar.log -c './test.sh'

test2.sh를 실행할 때 터미널에 다음이 표시될 것으로 예상됩니다.

Fri Feb 17 18:04:30 PST 2012  
/home/me/me

하지만 bar.log에서 나는 다음을 보고 싶습니다:

removed 'foo.tmp'  
Fri Feb 17 18:04:30 PST 2012  
/home/me/me

또는 (foo.tmp가 존재하지 않는 경우)

rm: cannot remove 'foo.tmp'  
Fri Feb 17 18:04:30 PST 2012  
/home/me/me

이것이 가능한가?

답변1

script임시 터미널의 모든 출력이 수집되고 자체 표준 출력이 해당 터미널에 표시되기 때문에 이를 직접 수행하기는 어렵습니다 .

에서는 test.sh터미널에 표시하려는 메시지와 기록에만 표시하려는 메시지를 구별할 수 있는 방법이 필요합니다. 예를 들어 각 줄에 접두사를 추가하여 중요도 수준을 나타냅니다. 예제의 다른 줄은 로 시작하지 않으므로 @중요하지 않은(기록 전용) 줄 앞에 를 붙입니다 @.

rm -v foo.tmp | sed 's/^/@/'
date
pwd

래퍼 스크립트에서:

script bar.log -c './test.sh | grep -v "^@"'

유틸리티를 수정하지 않고는 이보다 더 나은 결과를 얻을 수 없을 것 같습니다 script. (이 경로로 가고 싶다면 가장 쉬운 방법은 몇 줄이면 충분할 것 같습니다 expect.)

관련 정보