stderr 및 stdout을 다른 파일로 리디렉션하고 터미널에 표시하는 방법은 무엇입니까?

stderr 및 stdout을 다른 파일로 리디렉션하고 터미널에 표시하는 방법은 무엇입니까?

리디렉션이 없는 것처럼 터미널에서 명령 출력을 보고 싶습니다. 또한 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>&3tee는 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

그러나 이는 프로세스 대체를 지원하는 쉘에서만 작동합니다.

관련 정보