stdout 및 stderr을 파일로 리디렉션하고 stderr을 콘솔에 표시하는 방법은 무엇입니까?

stdout 및 stderr을 파일로 리디렉션하고 stderr을 콘솔에 표시하는 방법은 무엇입니까?

나는 파일로 리디렉션하고 기본 수준에서 tee를 사용하는 방법을 알고 있습니다. 그래서

$ alias outanderr='bash -c "echo stdout >&1; echo stderr >&2"'
# A fake "application" displaying both output and error messages.

$ outanderr 1>file      # redirect stdout to a file, display stderr
stderr

$ outanderr 2>file      # redirect stderr to a file, display stdout
stdout

$ outanderr 1>file 2>&1 # redirect both to a file, display nothing

$ outanderr | tee file; echo "-- file contents --" && cat file
# redirect stdout to a file, display both (note: order is messed up)
stderr
stdout
-- file contents --
stdout

$ outanderr 2>&1 | tee file; echo "-- file contents --" && cat file
# redirect both to a file, display both
stdout
stderr
-- file contents --
stdout
stderr

문제는 다음과 같은 결과를 얻으려면 물음표 대신 무엇을 써야 하는가입니다.

$ outanderr ???; echo "-- file contents --" && cat file
# redirect both to a file, display stderr
stderr
-- file contents --
stdout
stderr

요소:

  • 배쉬를 가정합니다.
  • 주문은 파일에 저장되어야 합니다.
  • stderr의 내용은 버퍼링 없이 실시간으로 한 줄씩 표시됩니다.
  • 별도의 스크립트 파일을 사용할 수 있습니다.
  • 마법이 필요할 수도 있습니다.

답변1

2>&1 >>outputfile | tee --append outputfile

테스트를 용이하게 하려면:

echo -n >outputfile; bash -c "echo stdout >&1; echo stderr >&2" 2>&1 >>outputfile |
  tee --append outputfile; echo "outputfile:"; cat outputfile

편집 1:

이는 파일에 stdout(전용)을 작성하고 sterr stdout을 파이프로 만든 다음 tee가 출력을 동일한 파일에 쓰도록 함으로써 수행됩니다.

>>두 쓰기 모두 추가 모드(추가 모드가 아님)에서 수행되어야 합니다 >. 그렇지 않으면 둘 다 서로의 출력을 덮어쓰게 됩니다.

파이프는 버퍼이므로 출력이 파일에 올바른 순서로 표시된다는 보장은 없습니다. 애플리케이션이 두 개의 파일 설명자(두 개의 파이프)에 연결되는 경우에도 이는 변경되지 않습니다. 순서를 보장하려면 두 출력 모두 동일한 채널을 통과하고 별도로 태그를 지정해야 합니다. 아니면 정말 멋진 것이 필요합니다.

  1. stdout과 stderr이 모두 파일(동일한 파일 아님!)로 리디렉션되고 두 파일이 모두 FUSE 볼륨에 있는 경우 FUSE 모듈은 두 번째 애플리케이션이 데이터를 올바르게 구문 분석할 수 있도록 각 쓰기에 타임스탬프를 스탬프 처리할 수 있습니다. 실제 출력 파일로. 또는 데이터에 레이블을 지정하지 않고 모듈이 결합된 출력 파일을 생성하도록 합니다. 아마도 아직 이 작업을 수행할 수 있는 FUSE 모듈이 없을 것입니다...
  2. stdout과 stderr 모두 /dev/null. 애플리케이션의 출력은 detach 를 통과합니다 strace -f -s 32000 -e trace=write. 이 경우 탈출을 취소해야 합니다. 말할 필요도 없이 앱은 추적되기 때문에 더 빠르게 실행되지 않습니다.
  3. 아마도 기존의 간단한 FUSE 모듈을 사용하고 애플리케이션 대신 모듈을 추적하면 동일한 효과를 얻을 수 있습니다. 이는 모듈이 애플리케이션보다 훨씬 적은 시스템 호출을 가질 수 있기 때문에 애플리케이션을 추적하는 것보다 더 빠를 수 있습니다.
  4. 애플리케이션 자체를 수정할 수 있는 경우: 애플리케이션은 모든 출력 후에 중지할 수 있으며(그러나 이는 내부에서만 수행될 수 있다고 생각합니다) 신호(SIGUSR1 또는 SIGCONT)를 수신한 후에만 계속할 수 있습니다. 파이프에서 읽는 애플리케이션은 파이프와 파일에서 새 데이터를 확인하고 새 데이터가 나올 때마다 신호를 보내야 합니다. 애플리케이션 유형에 따라 이는 strace 방법보다 빠르거나 느릴 수 있습니다. FUSE가 가장 빠른 솔루션이 될 것입니다.

관련 정보