为什么dos2unix打印到stderr?

时间:2014-07-13 07:22:19

标签: linux dos2unix

在文件上运行dos2unix时,我将以下内容打印到终端

dos2unix: converting file <filename> to UNIX format ...

在我尝试通过将输出发送到/ dev / null来抑制输出时,我注意到这是在stderr而不是stdout发出的,因为我预期(因为它看起来像是正常的消息,而不是错误) 。有这个原因吗?

5 个答案:

答案 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