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


30

리디렉션이없는 것처럼 터미널에서 명령의 출력을보고 싶습니다. 또한 stderr은 err.log로 경로 재 지정되어야하고 stdout은 stdout.log로 경로 재 지정되어야합니다.

또한 터미널에 표시되는 것과 동일한 사본, 즉 오류가 발생했을 때 발생하는 오류를 별도의 파일 stdouterr.log에 저장하는 것도 좋습니다.


@Nuno 아니에요. OP는 stdout 및 stderr에 대해 다른 파일을 원합니다.
dogbane

@ dogbane 네, 그렇습니다. 미안합니다.
Nuno C. Inácio

나는 아직도이 질문이 매우 친숙하다는 것을 안다. 여기를 보자 ... 여기에 매우 비슷한 하나의 unix.stackexchange.com/q/4195/250 이 있고 관련있는 하나의 unix.stackexchange.com/q/1416/250
phunehehe

답변:


37

tee다음과 같이 명령을 사용하십시오 .

(cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log

3>&1 1>&2 2>&3 tee는 stdout 만 허용하므로 stderr과 stdout을 바꾸는 방법입니다.

를 사용한 고급 리디렉션에 대해서는 Unix tee 명령 을 살펴보십시오 tee.


좋은 해결책. cmd 종료 코드를 얻는 방법이 있습니까?
turbanoff

2
교체 @turbanoff cmd와 함께 (cmd ; echo >exit_code.txt $?).
파르티아 어 총

나는 이것이 명령 행에 출력 된 것들의 순서를 더 잘 보존해야한다고 믿는다 :((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log)
TTT

5

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

stderr을 두 번째 tty로 직접 보낼 수 없습니까? 그런 다음 로그 파일이 필요하지 않습니다.
Steven Lu

@StevenLu 예, 이름을 알고 두 번째 tty에 쓸 수있는 권한이 있다면 가능합니다.
Jasen

1
&| tee all.log대신 명령의 끝에서 더 쉬울 것 입니다&> all.log
Jasen

@Jasen : 두 번째로 봅니다 &|. 이해가 &>, |&너무,하지만 무엇을 않는 &|이러한 맥락에서 의미? bash 매뉴얼 페이지 "bash (1)"를 참조하지 않고 인터넷이 아닌 적절한 구문 참조를 찾을 수 없습니다 ... Tx
Cbhihe

1
@Cbhihe 내가 할 수있는 한 아무 말도 할 수 없다|&
Jasen

3

@ dogbane, 감사합니다.
나는 리디렉션없이 인쇄 될 때 두 스트림을 대략 순서대로 저장하는 또 다른 방법을 찾았습니다.

command 2> >(tee errlog | tee -a bothLog > /dev/tty ) | tee outlog | tee -a bothLog

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


-2

이 시도 :

command 2>&1 | tee bothLog

4
안녕하세요 vasile, 이것은 질문에 대답하지 않습니다 : balki는 stdout과 stderr에 대해 별도의 파일이 필요합니다. 솔루션은 동일한 스트림에서 둘 다 혼합됩니다.
Mat

사람들이 왜 stdout과 stderr을 병합합니까? 아니면 다른 사람들에게 그렇게하도록 지시합니까?
nurettin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.