8

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

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

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

4

5 回答 5

7

在类 Unix 环境中,链式进程很常见:一个程序的结果被用作另一个程序的输入。将结果诊断混合起来会混淆下一个处理阶段。它还会对观看终端的潜在用户隐藏诊断信息,其中不会显示通过管道传输到下一个程序的处理结果。

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

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

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

于 2014-07-13T07:34:14.537 回答
6

没有理由,但通常stderr不仅仅是为了错误输出。它是另一个经常用于记录或信息性消息的流。由于没有输出日志消息,因此不会发送到stdout,这是程序的结果。

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

于 2014-07-13T07:26:47.860 回答
4
Try dos2unix -q <filename>

-q, --quiet 安静模式。禁止所有警告和消息。返回值为零。除非使用了错误的命令行选项。

于 2016-08-30T01:38:58.070 回答
3

仅仅因为这就是它的实施方式......

如果您查看源代码,您会看到:

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

...
于 2014-07-13T07:33:11.887 回答
1

我使用这个单线将 stderr 重定向到 stdout,跳过生成的第一个不相关的行,然后将其余的发送回 stderr。

dos2unix thefile 2>&1|tail -n+2 1>&2

于 2016-06-20T19:05:03.187 回答