我有一个应用程序,将fprintf的帮助和错误消息到stderr。
如果我以EXIT_SUCCESS状态退出(例如,当我向我的应用程序发出--help选项时),我应该向stdout发送消息吗?
同样,我是否应该继续向EXIT_FAILURE上的stderr发送错误消息?
或者我应该将所有帮助和错误消息发送到stdout
与POSIX兼容的UNIX应用程序的一般约定是什么?
发布于 2011-11-02 17:28:54
显然,错误消息应该发送到stderr,因为您不希望在重定向标准输出时捕获它们。
当由于某个命令行选项被无效使用而显示用法时,它将显示为错误消息(的一部分)。所以它应该转到stderr并导致EXIT_FAILURE。
当由于用户通过--help请求而显示用法时,它将显示为调用命令的所需行为。因此,它应该转到stdout,并且使用EXIT_SUCCESS命令应该会成功。
GNU coding standards中简要介绍了这一点。
发布于 2011-11-02 17:17:04
根据POSIX standard,标准错误用于写入诊断输出。他们似乎把定义什么是诊断输出留给了应用程序。
然而,在我看来,我不喜欢在stderr上编写帮助文本的应用程序,因为在文本上编写简单的grep比较困难。我会说,哪个程序能做到这一点,哪个不能做到这一点,两者之间的比例是50:50。
发布于 2016-12-21 10:15:02
Posix定义了标准的streams thus
在程序启动时,应预先定义三个流,无需明确打开:标准输入(用于读取常规输入)、标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。打开时,标准错误流不是完全缓冲的;当且仅当可以确定流不引用交互式设备时,标准输入和标准输出流才是完全缓冲的。
GNU C Library以类似的方式描述标准流:
文件变量:
*标准输出
标准输出流,用于程序的正常输出。
变量: FILE *标准错误
标准错误流,用于程序发出的错误消息和诊断。
因此,除了“常规/正常输出”和“诊断/错误输出”之外,标准定义对流的使用几乎没有指导。在实践中,通常将这两个流重定向到文件和管道,因此请考虑可能的用法。常规输出应该发送到stdout,特别是当用户可能要对其进行grep或其他分析时。尤其是帮助文本应该转到stdout,以便可以轻松地进行搜索和分页。一些系统会监视stderr的输出,并将其视为出现问题的迹象,因此通常仅将其用于实际错误和其他重要的诊断。最后,只有在流实际上是交互式的(例如,由isatty报告的)或通过命令行选项显式启用时,才发送交互式输出(如进度指示器)。
https://stackoverflow.com/questions/7977852
复制相似问题