我应该向STDERR或STDOUT输出警告吗?

时间:2009-09-16 04:34:27

标签: warnings stdout stderr

我正在创建一个处理预定义数据集的脚本,输出到文件。我想在一个数据(在我有权访问的每个集合中始终为“常规”)不同时声明该值未处理(因为我不知道它如何影响数据)时弹出警告。我应该将此警告输出到stderr或stdout吗?

3 个答案:

答案 0 :(得分:29)

如果我保存了此脚本的输出(即仅限stdout)以便我以后可以处理它,那么该警告会干扰输出的解析方式吗?此外,如果输出通过管道传输到另一个进程,则警告应显示在终端上,以便用户立即看到它。

出于这些原因,通常会向stderr输出警告。

答案 1 :(得分:6)

警告应该发给stderr。

除了其他人提出的要点(导致下游进程的解析错误以及在控制台上隐藏用户的错误)之外,还存在一个灵活性问题。

如果用户不希望来自stderr的警告转到正在解析stdout的下游进程,则他们不必做任何特殊的事情。

your_script | downstream_process

如果用户希望来自stderr的警告转到将解析stdout和stderr的下游进程,则用户可以使用2>& 1将stderr重定向到stdout。

your_script 2>&1 | downstream_process

如果将警告和任何正常数据输出到stdout,则用户无法在不解析所有内容的情况下将警告与数据分离。 因此,向stderr发送警告也会使您的脚本更具灵活性。

答案 2 :(得分:1)

真正的问题是:如果有人要将您脚本的输出重定向到文件,您是希望将警告放在文件中,还是直接发送给用户?

如果您希望用户因警告而采取某些操作,则应转至STDERR。如果某个下游脚本可能被警告触发,则应该转到STDERR。