2013-10-09 6 views
0

내에서 쉘 스크립트의 출력을 로그합니다. 나는 정확히 같은 결과 (화면 출력, STDOUT 및 STDERR 출력 모두를 포함하는 로그 파일을 얻을 내 스크립트했다해야하는지 궁금하네요어떻게이 경우 ksh93 스크립트가 (그러나 질문 관련 KSH되지 않음) 스크립트

./script 2>&1 | tee logfile 

: 현재

, 나는 같은 내 스크립트를 실행). 물론, '| tee logfile '을 사용합니다.

물론 그렇게하는 방법은 내 스크립트를 단순히 './script 2> &을 실행하는 다른 스크립트로 래핑하는 것일 수 있습니다. 티 로그 파일 '하지만이 스크립트 자체 내에서 할 수 있는지 궁금 해서요. 다소 약해

답변

2

한 일반적인 방법은 다음과 같습니다

#!/bin/sh 
test -z "$NOEXEC" && { NOEXEC=1 exec "$0" "[email protected]" 2>&1 | tee logfile; exit; } 
... 

tee에 의해 반환되는 값 반환 값 종료를 무시합니다. 이것은 문제 일 수도 있고 아닐 수도 있으며 원하는 행동 일 수 있습니다.

+0

당신은'exit'의 필요성에 대해 언급 할 수? 'tee'의 종료 상태에 관계없이 스크립트는 항상 상태 0으로 종료하게됩니다. – chepner

+0

스크립트가 두 번 실행되지 않도록하려면 'exit'이 필요합니다. 하지만 아마'exit $? '가 필요합니다. – chepner

+1

인수없이'exit'는'exit $? '와 같습니다. –

3

스크립트의 현재 내용 인 경우 :

command1 arg1 
command2 arg2 

는이 같은 (스크립트 내)이 많은 포장 할 수 있습니다

{ 
command1 arg1 
command2 arg2 
} 2>&1 | tee logfile 

{}에 대한 코드는 지금 스크립트 내의 I/O 리디렉션 단위. 마지막에 I/O 리디렉션은 모든 동봉 된 명령에 적용됩니다. 서브 쉘을 만들지는 않습니다. 명령에 설정된 모든 변수는 I/O 경로 재 지정 후 스크립트에서 사용할 수 있습니다.

{

} 약간 독특한 구문이다; 특히 } 앞에는 세미콜론이나 개행 문자가 와야합니다.

+0

당신의 솔루션은 윌리엄의 것보다 "깨끗한"것처럼 보이지만 내 스크립트와 함께 사용되면 모든 일을하지 않고 돌아온다. 이상한, 이유를 모르겠다. 그리고 그 순간을 조사 할 시간이 없다. 브래킷 (ksh93 사용) 내에서 실행되지 않는 먼 머신에서 ssh를 통해 많은 명령을 실행합니다. – claf

+0

이상한 일 - 왜 그렇게 될지 모르겠습니다. –