stdout과 stderr을 병합하고 각각의 복사본을 별도로 만듭니다.

stdout과 stderr을 병합하고 각각의 복사본을 별도로 만듭니다.

내 목표는 예를 통해 가장 잘 설명됩니다. 먼저, stdout 및 stderr에 대한 예제 출력을 생성하는 함수는 다음과 같습니다.

output() {
  printf '%s\n' 1 2
  printf '%s\n' errA errB 1>&2
  printf '%s\n' 3 4
}

별도로 실행하면 두 스트림 모두 실행 순서대로 터미널에 인쇄됩니다.

$ output
1
2
errA
errB
3
4

이제 이 함수는 기록하려는 스크립트의 출력(stdout 및 stderr)을 나타내는 자리 표시자일 뿐입니다. 구체적으로 우리는 세 가지 다른 로그를 생성하려고 합니다.

  1. stdout과 stderr의 조합은 순차 출력(위의 출력)을 수행합니다.
  2. 그냥 표준 출력
  3. 그냥 표준 오류 출력

내가 생각해낸 가장 가까운 해결책은 다음과 같습니다.

$ { output > >(tee out) 2> >(tee err >&2); } > both 2>&1
$ ls
both  err  out
$ cat both
errA
errB
1
2
3
4
$ cat out
1
2
3
4
$ cat err
errA
errB

보시 out다시피 및 err파일이 필요하지만 결합된 파일은 both실행 순서를 유지하지 않습니다.

3개의 필수 로그 파일을 동시에 생성할 수 있는 방법이 있습니까?

output추가 질문으로, 함수가 개별적으로 실행될 때 실행 순서 출력이 실제로 보장됩니까? 여러 번 실행을 시도했는데 터미널에서 혼합된 stdout과 stderr이 항상 동일하고 올바른 순서입니다. 그러나 이는 보증과 동일하지 않습니다.

관련 정보