합계를 콘솔 화면에 출력 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!
내 질문은 다음과 같습니다
- 파일로 출력
stdout
하고 캡처하는 방법은 무엇입니까 ?stderr
(해봤는데./test|tee 2>log
안되더라구요) stderr
두 가지를 모두 파일로 출력하고 캡처하려면 어떻게 해야 합니까 ?
답변1
- stdout만 출력하고 stderr을 파일로 캡처하려면 어떻게 해야 합니까? (./test|tee 2>log를 시도했지만 작동하지 않았습니다)
$ ./test 2>log
OUT!
$ cat log
ERR!
- 둘 다 출력하고 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!
또는 bash
POSIX 셸을 사용하지 않고 를 사용하는 경우 더 간단한 형식을 사용할 수 있습니다.
$ ./test &>log
$ cat log
OUT!
ERR!
답변2
쉘 리디렉션이면 충분합니다. 먼저 stderr
파일로 리디렉션합니다.
$ ./test 2> myfile.txt
stdout
리디렉션되지 않기 때문에 여전히 여기에 화면이 있습니다. myfile.txt
ERR이 포함됩니다.
그런 다음 둘 다 출력하고 여전히 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]