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

Ruby's output in the Windows console VS mingw64 VS cygwin64

我遇到了一个非常奇怪的问题。这是使用 puts:

的简单代码
puts "Dale"
sleep 1
puts "Cooper"

我有 3 个不同的 terminals/consoles:

这是一件奇怪的事情:代码仅在标准 Windows 控制台中按预期运行。类 UNIX 终端等待 1 秒,然后才显示输出(两条线同时显示)。基本上,类 UNIX 终端都是在等待程序退出,然后显示最终的输出结果。

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

但接下来的两个示例在所有 3 个中都有效 terminals/consoles:

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

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

p "Dale"
sleep 1
p "Cooper"

说到这里,我认为这与Ruby有关。我试过不同版本的 Ruby.

有人可以解释为什么会这样吗?有什么可能的方法可以绕过这个问题?

这是我自己回答的问题。

背景不多

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

解决方案

您可以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"

正在确定它是 Windows 控制台还是 UNIX-like 终端

这是 @eryksun 建议的一个小技巧,可以知道代码是在 Windows 控制台还是 UNIX-like 终端中运行。 STDOUT.isatty 在 Windows 下运行时有点颠倒,但它确实起到了作用。

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

请记住,这假设您已经知道代码正在 Windows 下运行。 here.

描述了一种检查 OS 的好方法

参考资料

可以在此处找到答案的主要来源。答案的想法属于 @eryksun.

STDOUT.sync, STDOUT.sync = (关于这个方法), STDOUT.flush, STDOUT.isatty.