리디렉션이 없는 것처럼 터미널에서 명령 출력을 보고 싶습니다. 또한 stderr은 err.log로 리디렉션되어야 하고, stdout은 stdout.log로 리디렉션되어야 합니다.
터미널에 표시되는 내용(즉, 오류 발생 시 인쇄되는 오류)의 정확한 복사본을 별도의 stdouter.log 파일에 보관하는 것이 좋을 것입니다.
답변1
tee
다음과 같이 명령을 사용하십시오 .
(cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log
3>&1 1>&2 2>&3
tee는 stdout만 허용하므로 stderr과 stdout이 교체되는 방식입니다.
보세요유닉스 티 명령고급 리디렉션에 사용합니다 tee
.
답변2
나는 stdout과 stderr을 두 개의 다른 파일에 기록하는 것이 좋은 생각이라고 생각합니다. 로그를 비동기화하지 않습니까? 그래서 다음을 시도했습니다.
- stdout을 "stdout.log"로 (dogbane이 제안한대로)
- "stderr.log"에 대한 stderror (dogbane이 제안한대로)
- 모든 출력은 "all.log"로 출력되며
- 여전히 디스플레이에서 출력을 볼 수 있습니다(비록 별도의 터미널에 있음!)
((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log) &> all.log
다른 터미널에서
tail -f --sleep-interval=2 all.log
답변3
@dogbane님, 감사합니다.
또한 리디렉션 없이 인쇄되므로 두 스트림을 대략적인 순서대로 저장하는 또 다른 방법도 찾았습니다.
command 2> >(tee errlog | tee -a bothLog > /dev/tty ) | tee outlog | tee -a bothLog
그러나 이는 프로세스 대체를 지원하는 쉘에서만 작동합니다.