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