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控制台(系统默认)
- mingw64(与 Git 一起安装的类 UNIX 终端)
- cygwin64(类 UNIX 终端)
这是一件奇怪的事情:代码仅在标准 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.
我遇到了一个非常奇怪的问题。这是使用 puts:
的简单代码puts "Dale"
sleep 1
puts "Cooper"
我有 3 个不同的 terminals/consoles:
- Windows控制台(系统默认)
- mingw64(与 Git 一起安装的类 UNIX 终端)
- cygwin64(类 UNIX 终端)
这是一件奇怪的事情:代码仅在标准 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 = (