Ruby的输出在Windows控制台VS mingw64 VS cygwin64中

问题描述 投票:1回答:1

我在这里遇到了一个非常奇怪的问题。这是使用puts的简单代码:

puts "Dale"
sleep 1
puts "Cooper"

我有3个不同的终端/控制台:

  • Windows控制台(系统默认)
  • mingw64(与Git一起安装的类UNIX终端)
  • cygwin64(类UNIX终端)

这有点奇怪:代码只在标准Windows控制台中按预期运行。类UNIX的终端正在等待1秒钟,然后才显示输出(同一时刻两条线路)。基本上,类UNIX的终端正在等待程序退出,然后它们显示输出的最终结果。

如果我用put替换puts,它不会影响执行过程。类似UNIX的终端仍会延迟输出,直到程序退出。

但接下来的两个例子适用于所有3个终端/控制台:

system("echo Dale")
sleep 1
system("echo Cooper")

这个添加了引号,但除此之外,代码按预期工作。

p "Dale"
sleep 1
p "Cooper"

话虽如此,我认为这与Ruby有关。我尝试过不同版本的Ruby。

有人可以解释为什么会发生这种情况以及绕过这个问题的可行方法是什么?

ruby windows cygwin mingw windows-console
1个回答
1
投票

这是我回答我自己的问题。

Little background

如果您在代码之前执行puts STDOUT.sync,那么您将看到无论您使用的是Windows控制台还是类UNIX终端,都会说STDOUT.sync设置为false。这很奇怪,因为Windows控制台会立即刷新输出,而类似UNIX的终端则不会。我不确定为什么会这样。

Solution

您可以执行STDOUT.flush(或$stdout.flush)来刷新缓冲区,也可以将STDOUT.sync(或$ stdout.sync)设置为true。两种变体都与Windows控制台完全友好。所以代码如下:

puts "Dale"
STDOUT.flush
sleep 1
puts "Cooper"

或更多推荐:

STDOUT.sync = true
puts "Dale"
sleep 1
puts "Cooper"

Determining whenever it's Windows console or UNIX-like terminal

这是@eryksun建议的一个小技巧,用于了解代码是否在Windows控制台或类UNIX终端中运行。 STDOUT.isatty在Windows下运行时有点颠倒,但不过它可以解决问题。

if STDOUT.isatty
    # Windows console
else
    # UNIX-like terminal
end

请记住,这假设您已经知道代码是在Windows下运行的。 here描述了检查操作系统的好方法。

References

答案的主要来源可以找到here。答案的想法属于@eryksun

STDOUT.syncSTDOUT.sync =(关于这种方法的question),STDOUT.flushSTDOUT.isatty

© www.soinside.com 2019 - 2024. All rights reserved.