내 목표는 예를 통해 가장 잘 설명됩니다. 먼저, 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의 조합은 순차 출력(위의 출력)을 수행합니다.
- 그냥 표준 출력
- 그냥 표준 오류 출력
내가 생각해낸 가장 가까운 해결책은 다음과 같습니다.
$ { 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이 항상 동일하고 올바른 순서입니다. 그러나 이는 보증과 동일하지 않습니다.