我是一名编程新手,我正在尝试了解
stdin
、stdout
和 stderr
的工作原理。据我了解,stdout
和stderr
是我们可以直接从程序输出的两个不同的地方。我想我不明白仅仅针对 stderr
的错误有第二个“流”输出有什么意义?为什么常规的stdout
没有错误? stderr
出现错误可以让我做什么(基本上为什么 stderr
有用)?
支持不同的 stout 和 stderr 流有两个“点”:
当您编写可以链接在一起的应用程序(例如使用管道)时,您不希望“正常”输出与错误、警告、调试信息和其他“闲聊”混合在一起。将它们混合在同一个流中将使链/管道中的下一个程序变得困难。
示例:
$ cat some-file | grep not
$ echo $?
如果
cat
命令未将其错误消息写入 stderr,则当 grep
不存在时,"file not found"
命令将看到 "some-file"
消息。然后它会(错误地)匹配“not”,并错误地设置管道的返回代码。建造应对此类事情的管道将是极其困难。
自 1970 年代起,(至少)UNIX 和类 UNIX 系统就支持单独的 stdout 和 stderr 流。它们是 POSIX 标准的一部分。如果一种新的编程语言的运行时库不支持这一点,那么它就会被认为是残废的;即不适合编写生产质量应用程序。
(在编程语言的历史上,Python还是比较新的。)
但是,没有人强迫您编写应用程序以使用 stderr 来实现其预期目的。 (嗯……也许你未来的同事会:-))
在 UNIX(以及 Linux 和其他 Posix 兼容系统)中,程序通常与管道结合使用,以便一个程序将另一个程序的输出作为输入。如果将正常输出和错误信息混合在一起,每个程序都需要知道如何以不同于正常数据的方式处理来自其管道数据生成器的诊断信息。实际上,由于程序组合数量众多,这是不可能的。 通过将错误信息写入 stderr,每个程序都可以让用户获取此信息,而无需将其从管道中的下一个程序读取的数据流中过滤出来。