gpt4 book ai didi

ruby - 为什么在重定向时,Ruby 的 STDERR 输出先于 STDOUT 输出?

转载 作者:数据小太阳 更新时间:2023-10-29 07:04:00 25 4
gpt4 key购买 nike

在 bash 中,这给出了预期顺序的输出:

ruby -e "puts 'one'; raise 'two'"
one
-e:1:in `<main>': two (RuntimeError)

但是如果我将 STDERR 重定向到 STDOUT,我会在输出之前收到错误,这是我不想要的:

ruby -e "puts 'one'; raise 'two'" 2>&1 | cat
-e:1:in `<main>': two (RuntimeError)
one

我想将输出重定向到一个文本文件(它的行为方式与上面的 cat 相同)并获得输出和异常,但顺序与查看我的输出时的顺序相同终端。这能实现吗?

最佳答案

发生这种情况是因为行缓冲与 block 缓冲。您可以控制缓冲的类型,可以在您希望同步它们的输出时刷新它们,或者您可以等到退出时刷新所有内容。除非您强制采用一种方式,否则缓冲取决于输出是否为 tty 类型1 文件描述符,因此重定向到管道会改变模式。

具体来说:

                 true          false 
------------- --------------
$stdout.tty? line-buffered block-buffered
$stderr.tty? line-buffered line-buffered

您可以使用相同的方式配置它们:

$stdout.sync = $stderr.sync = true # or false, of course

我的测试用例:

$stdout.sync = $stderr.sync = true
$stdout.puts 'stdout a'
sleep 2
$stdout.puts 'stdout b'
sleep 2
$stderr.puts 'stderr a'
sleep 2
$stderr.puts 'stderr b'
sleep 2


<补充>1。参见 ttyname(3)。

关于ruby - 为什么在重定向时,Ruby 的 STDERR 输出先于 STDOUT 输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8901524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com