Answers:
是的,请stderr
在使用错误的参数时显示一条消息。如果这也导致应用程序退出,请以非零退出状态退出。
您应该将标准错误流用于诊断消息或用户交互。诊断消息包括错误消息,警告和其他在实用程序正常运行时不属于输出的消息(“正确”表示没有异常事件发生,例如找不到文件或可能存在的任何错误)。
许多外壳程序(全部?)会显示提示,用户键入的内容以及菜单等,stderr
因此重定向stdout
不会阻止您以有意义的方式与外壳程序进行交互。
以下是关于该主题的博客文章:
这是Unix管道的发明者Doug McIllroy的话,它解释了如何
stderr
实现。“ v6”是指1975年发布的原始Unix操作系统的特定版本。所有程序都将诊断放在标准输出上。当将输出重定向到文件时,这总是会造成麻烦,但是当将输出发送到毫无怀疑的过程时,这将变得无法忍受。但是,由于不愿意违反标准输入标准输出模型的简单性,人们通过v6容忍了这种情况。此后不久,丹尼斯·里奇(Dennis Ritchie)通过引入标准误差文件切开了高迪安结。这还不够。使用管道,诊断可以来自同时运行的多个程序中的任何一个。诊断程序需要识别自己。
-Doug McIllroy,“研究UNIX的读者:1971-1986年程序员手册中的注释摘录”
“识别自己”意味着简单地说:“嘿!我在说话!这出了错:[...]”:
$ ls nothere
ls: nothere: No such file or directory
在这样做stderr
是最好的,因为它可以通过,否则无论是阅读上阅读stdout
(但我们不这样做,与ls
无论如何,我们呢?)。
根据POSIX规范的标准流:
在程序启动时,应预定义三个流,而不必显式打开它们:标准输入(用于读取常规输入),标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。
换句话说,错误,调试信息以及所有属于诊断类别的内容都会进入stderr
。
有关更多信息,请参见相关问题:进度报告/日志记录信息属于stderr还是stdout?