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