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