내 목표는 예를 통해 가장 잘 설명됩니다. 시작하려면 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)을 나타내는 단순한 자리 표시자입니다. 구체적으로 우리는 세 가지 다른 로그를 생성하려고 합니다.
- stdout과 stderr의 결합된 실행 순서 출력(즉, 위의 출력).
- 그냥 stdout 출력
- 그냥 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
보시다시피 out
및 err
파일은 원하는 대로인데 결합된 파일이 both
실행 순서를 유지하지 않습니다.
원하는 로그 파일 3개를 동시에 생성할 수 있는 방법이 있습니까?
output
보너스 질문으로, 함수를 자체적으로 실행할 때 실행 순서 출력이 실제로 보장됩니까 ? 여러 번 실행을 시도했는데 터미널에 혼합된 stdout과 stderr이 항상 동일하고 올바른 순서로 표시되었습니다. 그러나 그것은 보증과 같은 것이 아닙니다.