当我想重定向任何详细输出时,我通常会执行以下操作,
[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
为什么go to的详细输出stderr
而不是stdout
?这对于脚本编写来说是非常有问题的,因为在脚本末尾,会检查错误文件,如果在文件上发现任何内容,则会完成清理过程。
问题是,
gzip
为什么go to的详细输出stderr
而不是stdout
?- 我怎样才能克服这个问题?
答案1
实际上,gzip 将诊断输出打印到 stderr 更好,因为否则您将无法区分诊断和数据(在 的情况下-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
选项。