"app --help" 应该输出到标准输出(stdout)还是标准错误(stderr)?

19

我认为应该使用标准输出(stdout),这样你可以轻松地使用grep,你觉得呢?


当然是stderr。这就是Unix期望的一切。 - mirabilos
1
可能是真正正确的答案 ;-) - sphakka
5个回答

15

stdout如果用户在使用--help参数时请求它,例如,可以更容易地将其导入到less、grep等命令中。

stderr如果您显示帮助文本的原因是出现问题,例如解析命令行参数。


好的,他/她明确说了“app --help”,所以我认为“--help”被识别为命令行参数。 - Deniz Dogan
1
我只是在建议一种情况,您可能需要将帮助发送到 stderr。 - Paul Dixon
不是"可能"使用stderr,而是在非--help情况下"应该"使用stderr:如果您显示帮助文本是因为存在使用问题,您不希望将该使用消息与输出混合在一起(输出可能正在发送到文件、管道或其他操作员无法看到的地方)。 - Charles Duffy
我同意。已经过去了14年,所以我已经改进了它! - Paul Dixon

13
好吧,这是一个明确的求助请求,所以应该输出。
如果由于某种原因无法输出帮助信息,或者用户拼写“help”错误,那么请将其发送到错误输出,因为那将是诊断信息。
知道自己在做什么的用户可以使用臭名昭著的"2>&1",如果他们希望在标准输出上显示错误信息。

1
这就是答案! - Grijesh Chauhan

12

只有错误才会发送到 stderr。这并不是一种错误,它恰好完成了用户的意图,也就是打印使用信息。


不是“只有错误”;所有不是输出的内容都发送到stderr。日志发送到stderr。提示信息发送到stderr。信息和诊断消息发送到stderr。_但是_你是对的:当使用--help运行程序时,使用说明消息是预期的输出,所以它应该在stdout上显示。 - Charles Duffy

1

这不是一个错误,所以我会说stdout....


标准错误流(stderr)不仅仅用于错误信息,它还用于所有打算供人类操作员阅读的内容,而不是通过管道或文件接收程序预期输出的内容。但是,当使用--help调用时,使用说明消息就成了预期的输出;所以将其放在标准输出流(stdout)是正确的做法,但推理过程有误。 - Charles Duffy

0

netcat 是我能想到唯一一个会将 -h 重定向到 stderr 的应用程序,但我无法理解为什么。

我想,如果您正在输出帮助信息,因为有人使用了不正确的参数,您可能希望将其重定向到 stderr,但即使在这种情况下,我也不会使用 stderr,因为我认为在错误日志中垃圾邮件错误日志与完整的帮助文本是没有用的 - 我宁愿只输出一个指出参数格式不正确的单个错误到 stderr。如果有人明确使用 -h 或 --help 调用您的应用程序,则真的不应将其重定向到 stderr。


stderr不仅仅用于错误日志 - 它用于“向人类操作员显示”,这就是为什么(例如)shell提示将其发送到stderr而不是stdout的原因。stdout进入管道,因此通常会被单独的程序解析或消耗。(POSIX的意思是stderr用于“诊断”内容,而stdout仅用于输出;知道程序何时准备好接受更多输入,如提示所示,属于诊断类别)。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接