자세한 출력을 리디렉션하려는 경우 일반적으로 다음을 수행합니다.
[arif@arif test]$ rsync -v /home/arif/storage . 1> stdout
[arif@arif test]$ cat stdout
storage
sent 177 bytes received 35 bytes 424.00 bytes/sec
total size is 88 speedup is 0.42
하지만 같은 일을 하면 gzip
다른 결과가 나옵니다.
[arif@arif test]$ gzip -v something 1> stdout 2> stderr
[arif@arif test]$ cat stdout
[arif@arif test]$ cat stderr
something: 0.0% -- replaced with something.gz
gzip
stderr
왜 대신 자세한 출력을 가지게 됩니까 stdout
? 스크립트 끝에서 오류 파일을 확인하고 파일에서 아무 것도 발견되면 정리 프로세스가 완료되기 때문에 이는 스크립팅에 매우 문제가 됩니다.
문제는,
gzip
stderr
왜 대신 자세한 출력을 가지게 됩니까stdout
?- 이 문제를 어떻게 극복할 수 있습니까?
답변1
실제로 gzip이 진단 출력을 stderr로 인쇄하는 것이 더 좋습니다. 그렇지 않으면 진단과 데이터(gzip의 경우)를 구별할 수 없기 때문입니다 -c
.
각 프로그램은 원하는 곳에 자유롭게 메시지를 보낼 수 있습니다.gzip으로 stderr로 압축
1060 /* Display statistics */
1061 if(verbose) {
1062 if (test) {
1063 fprintf(stderr, " OK");
1064 } else if (decompress) {
1065 display_ratio(bytes_out-(bytes_in-header_bytes), bytes_out,stderr);
1066 } else {
1067 display_ratio(bytes_in-(bytes_out-header_bytes), bytes_in, stderr);
1068 }
1069 if (!test && !to_stdout)
1070 fprintf(stderr, " -- %s %s", keep ? "created" : "replaced with",
1071 ofname);
1072 fprintf(stderr, "\n");
1073 }
해결 방법은 각 유틸리티의 자체 조건에 따라 이를 처리하고 stderr에서 특정 gzip 메시지를 예상하거나 옵션을 무시하는 것입니다 -v
.