在文件上运行dos2unix时,我将以下内容打印到终端
dos2unix: converting file <filename> to UNIX format ...
在我尝试通过将输出发送到/ dev / null来抑制输出时,我注意到这是在stderr而不是stdout发出的,因为我预期(因为它看起来像是正常的消息,而不是错误) 。有这个原因吗?
答案 0 :(得分:6)
没有理由,但通常stderr
不仅仅是错误输出。它是另一个经常用于记录或信息性消息的流。由于日志消息不是输出,因此不会将其发送到stdout
,这是用于程序的结果。
它在你的终端上打印的原因是你的shell的结果,而不是真正由应用程序控制。
答案 1 :(得分:6)
在类Unix环境中,链式流程很常见:一个程序的结果用作另一个程序的输入。将结果与诊断混合会混淆下一个处理阶段。它还会隐藏潜在用户观看终端的诊断信息,其中处理结果通过管道输送到下一个节目。
这是在stdout和stderr中分离结果和诊断的原因。诊断不仅限于错误,还应包含所有不是后续程序所期望的处理结果的内容。
关于实际问题:dos2unix经常用于原位转换文件,但也可以输出到stdout(当没有文件名调用时,它从stdin读取并输出到stdout)。然后stdout可以独立于stderr重定向。考虑cat blados | dos2unix > blaunix
。您仍然可以看到诊断(可能包含错误消息!),但处理结果将转到blaunix。
在成功的情况下打印诊断并不常见 - 可能对DOS用户有点点头。如果处理结果包含信息性消息,那将是非常糟糕的;例如,它会破坏C文件。
答案 2 :(得分:3)
仅仅因为它的实施方式......
如果您查看 the source-code ,您会看到:
...
if (!pFlag->Quiet)
fprintf(stderr, _("dos2unix: converting file %s to file %s in UNIX format ...\n"), argv[ArgIdx-1], argv[ArgIdx]);
...
答案 3 :(得分:2)
Try dos2unix -q <filename>
-q, - quiet 静音模式。取消所有警告和消息。返回值为零。除非使用了错误的命令行选项。
答案 4 :(得分:1)
我使用这个单行程序将stderr重定向到stdout,跳过产生的第一个不相关的行,然后将其余部分发送回stderr。
dos2unix thefile 2>&1|tail -n+2 1>&2