Linux 为什么dos2unix打印到stderr?

Linux 为什么dos2unix打印到stderr?,linux,dos2unix,Linux,Dos2unix,在文件上运行dos2unix时,我会将以下内容打印到终端 dos2unix: converting file <filename> to UNIX format ... dos2unix:正在将文件转换为UNIX格式。。。 在我试图通过将输出发送到/dev/null来抑制输出时,我注意到这是在stderr上发送的,而不是像我预期的那样在stdout上发送的(因为这似乎是一条正常消息,而不是错误)。这有什么原因吗?没有原因,但通常情况下,stderr不仅仅用于错误输出。它是另一个经

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

dos2unix: converting file <filename> to UNIX format ...
dos2unix:正在将文件转换为UNIX格式。。。

在我试图通过将输出发送到/dev/null来抑制输出时,我注意到这是在stderr上发送的,而不是像我预期的那样在stdout上发送的(因为这似乎是一条正常消息,而不是错误)。这有什么原因吗?

没有原因,但通常情况下,
stderr
不仅仅用于错误输出。它是另一个经常用于记录或信息消息的流。由于未输出日志消息,因此不会将其发送到用于程序结果的标准输出


打印在终端上的原因是shell的结果,而不是由应用程序真正控制。

只是因为它是以这种方式实现的

如果您查看,您将看到:

...
if (!pFlag->Quiet)
    fprintf(stderr, _("dos2unix: converting file %s to file %s in UNIX format ...\n"), argv[ArgIdx-1], argv[ArgIdx]);

...

在类似Unix的环境中,链接进程是很常见的:一个程序的结果被用作另一个程序的输入。将结果诊断混合会混淆下一个处理阶段。它还将隐藏诊断信息,不让潜在用户观看终端,因为传输到下一个程序的处理结果不会显示

这就是在stdout和stderr中分离结果和诊断的原因。诊断不限于错误,但应包含并非后续程序预期的处理结果的所有内容

关于实际问题:dos2unix通常用于就地转换文件,但也可以输出到stdout(在没有文件名的情况下调用时,它从stdin读取并输出到stdout)。然后可以独立于stderr重定向stdout。考虑<代码> CAT BLADOS.DOS2UNIX> BLUUNX。您仍将看到诊断(可能包含错误消息!),但处理结果将转到blaunix


在成功的情况下,打印诊断根本不太常见——可能有点向DOS用户点头。如果处理结果包含信息性消息,那将非常糟糕;例如,它会破坏一个C文件

我使用这一行代码将stderr重定向到stdout,跳过生成的第一行不相关的内容,并将其余内容发送回stderr

dos2unix文件2>&1 | tail-n+21>&2

试试dos2unix-q
Try dos2unix -q <filename>
-q、 ”“安静
安静模式。抑制所有警告和消息。返回值为零。除非使用了错误的命令行选项。

您会发现unix中充满了历史工件,例如为什么
dd
需要像
if=…
这样的参数,为什么
tar
需要没有前导
-
的位置参数。它就是这样……如果您还没有找到它,您可以使用
--quiet
标记来抑制此输出,因为它很无聊。但在过去,你可以通过管道输入数据,然后通过管道输出数据。需要放置在stderrI中的错误打赌dos2unix过去是使用
tr-d'\r'file2
手动完成的,在这种情况下,stdin和stdout已经很忙了。既然如此,您可以改进源代码以满足您的需要(但您可能应该发布修补程序…)虽然严格来说,问题不在于它是否得到了实施(这一点很明显),而是为什么。因此,有人可能会争辩说,你的答案与其说是答案,不如说是对现状的确认。尽管如此,我还是很高兴能找到它。到底为什么有人会这么做?