stderr, stdout을 콘솔에 출력하고 동시에 파일에 저장

stderr, stdout을 콘솔에 출력하고 동시에 파일에 저장

합계를 콘솔 화면에 출력 stdout하고 stderr그 중 하나를 로그 파일에 저장할 수 있나요?

테스트 쉘 스크립트를 작성했습니다.

#!/bin/sh

echo OUT! >&1
echo ERR! >&2

스크립트를 실행하여 화면에 출력할 수 있습니다.

$./test 
OUT!
ERR!

다음을 통해 출력 stderr하고 stdout로그 파일로 캡처할 수 있습니다.

$./test | tee 1>log
ERR!

$cat log 
OUT!

stdout아무것도 출력할 수 없습니다. 모든 것을 캡처 하여 다음을 통해 로그 파일에 쓸 수만 있습니다 stderro.

$./test 2>&1| tee 1>log

$cat log 
OUT!
ERR!

다음을 통해 합계를 출력 stdout하고 stderr모두 로그 파일에 캡처할 수 있습니다.

$./test 2>&1 | tee log
OUT!
ERR!

$cat log 
OUT!
ERR!

stdout다음을 통해 로그 파일을 출력할 수 있습니다 .

$./test | tee 2>&1 log
ERR!
OUT!

$cat log 
OUT!

내 질문은 다음과 같습니다

  1. 파일로 출력 stdout하고 캡처하는 방법은 무엇입니까 ? stderr(해봤는데 ./test|tee 2>log안되더라구요)
  2. stderr두 가지를 모두 파일로 출력하고 캡처하려면 어떻게 해야 합니까 ?

답변1

  1. stdout만 출력하고 stderr을 파일로 캡처하려면 어떻게 해야 합니까? (./test|tee 2>log를 시도했지만 작동하지 않았습니다)
$ ./test 2>log
OUT!
$ cat log
ERR!
  1. 둘 다 출력하고 stderr을 파일로 캡처하려면 어떻게 해야 합니까?
$ ./test 2>&1 >/dev/tty | tee log
OUT!
ERR!
$ cat log
ERR!

이 표현식이 더 큰 파이프의 일부인 경우 이를 피하는 것이 좋습니다 /dev/tty. 한 가지 방법은 stdout과 stderr을 바꾸는 것입니다. 이 교환을 수행하려면 다음과 같이 세 번째 파일 핸들을 생성해야 합니다.

$ exec 3>&1; ./test 2>&1 1>&3 | tee log; exec 3>&-
OUT!
ERR!
$ cat log
ERR!

첫 번째 명령문은 exec 3>&1파일 핸들 3을 현재 표준 출력(무엇이든)에 할당합니다. 그런 다음 stderr은 명령 ./test 2>&1 1>&3 | tee log으로 파이프되고 stdout은 파일 핸들 3으로 전송됩니다. tee마지막으로, 원활한 관리를 위해 exec 3>&-파일 핸들 3을 닫습니다.

추가 메모 및 의견

에 대한:

다음을 통해 stderr을 출력하고 stdout을 로그 파일로 캡처할 수 있습니다.

$./test | tee 1>log
ERR!
$cat log 
OUT!

다음과 같이 단순화할 수 있습니다.

$ ./test >log
ERR!
$ cat log
OUT!

또한 다음과 관련하여:

아무것도 출력할 수 없으며 다음을 통해 모든 stdout 및 stderro를 로그 파일로 캡처할 수만 있습니다.

$ ./test 2>&1| tee 1>log
$ cat log 
OUT!
ERR!

다음과 같이 단순화할 수 있습니다.

$ ./test >log 2>&1
$ cat log
OUT!
ERR!

또는 bashPOSIX 셸을 사용하지 않고 를 사용하는 경우 더 간단한 형식을 사용할 수 있습니다.

$ ./test &>log
$ cat log
OUT!
ERR!

답변2

쉘 리디렉션이면 충분합니다. 먼저 stderr파일로 리디렉션합니다.

$ ./test 2> myfile.txt

stdout리디렉션되지 않기 때문에 여전히 여기에 화면이 있습니다. myfile.txtERR이 포함됩니다.

그런 다음 둘 다 출력하고 여전히 stderr파일로 캡처하려면 두 단계로 몇 가지 명령 대체를 수행해야 할 수 있습니다.

$ ./test 2> >(tee myfile.txt >&2)

이렇게 하면 오류 스트림이 tee프로세스로 전송되어 오류가 다시 인쇄됩니다. stdout끊임없는.자세한 내용은 이 스택 오버플로 질문을 확인하세요..

stdout마찬가지로 파일을 캡쳐해서 그대로 두고 싶다면 stderr...

$ ./test > >(tee myfile.txt)

답변3

글쎄요, 남자들과 여자들...

이 스레드를 풍성하게 하기 위해 일반적인 단순화된 사례로 답변을 게시하는 것이 가장 좋다고 생각합니다.

stdout 및 stderr을 터미널로 출력하고 stdout 및 stderr을 파일로 캡처합니다...

stdout과 stderr이 터미널과 파일로 출력되는지 테스트해 보세요...

rm -f test.log
ping 127.0.0.1 -c 6 2>&1 | tee test.log
cat test.log

터미널과 파일에 stderr이 출력되는지 확인...

rm -f test.log
ping e.r.r.or -c 6 2>&1 | tee test.log
cat test.log

감사해요! =디

[참조 번호:https://stackoverflow.com/a/12928057/3223785]

관련 정보