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

时间:2018-03-02 18:03:48

标签: ruby windows cygwin mingw windows-console

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

puts "Dale"
sleep 1
puts "Cooper"

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

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

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

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

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

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

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

p "Dale"
sleep 1
p "Cooper"

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

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

1 个答案:

答案 0 :(得分:1)

我在回答我自己的问题。

小背景

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

解决方案

您可以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的终端

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

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

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

参考

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

STDOUT.syncSTDOUT.sync =question关于此方法), STDOUT.flushSTDOUT.isatty