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. 그냥 stdout 출력
  3. 그냥 stderr 출력

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

$ { 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

보시다시피 outerr파일은 원하는 대로인데 결합된 파일이 both실행 순서를 유지하지 않습니다.

원하는 로그 파일 3개를 동시에 생성할 수 있는 방법이 있습니까?

output보너스 질문으로, 함수를 자체적으로 실행할 때 실행 순서 출력이 실제로 보장됩니까 ? 여러 번 실행을 시도했는데 터미널에 혼합된 stdout과 stderr이 항상 동일하고 올바른 순서로 표시되었습니다. 그러나 그것은 보증과 같은 것이 아닙니다.

관련 정보