代码之家  ›  专栏  ›  技术社区  ›  MOPO3OB

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

  •  1
  • MOPO3OB  · 技术社区  · 6 年前

    我这里有个很奇怪的问题。下面是使用 :

    puts "Dale"
    sleep 1
    puts "Cooper"
    

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

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

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

    如果我更换 具有 打印 ,不会影响执行过程。类UNIX终端仍将延迟输出,直到程序退出。

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

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

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

    p "Dale"
    sleep 1
    p "Cooper"
    

    说到这里,我想这与Ruby有关。我尝试了不同版本的Ruby。

    有人能解释为什么会发生这种情况,以及绕过这个问题的可能方式吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   MOPO3OB    6 年前

    我来回答我自己的问题。

    小背景

    如果你这样做了 puts STDOUT.sync 在代码之前,您将看到,无论您使用的是Windows控制台还是类UNIX终端,它都会说 标准输出。同步 设置为 错误 . 这很奇怪,因为Windows控制台正在立即刷新输出,而类UNIX终端则没有。我不知道为什么会发生这种情况。

    解决方案

    你可以做到 STDOUT.flush (或 $stdout.flush )刷新缓冲区或您可以设置 标准输出。同步 (或 $stdout。同步 )至 真的 . 这两种变体都对Windows控制台非常友好。因此,代码如下所示:

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

    或更多建议:

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

    确定何时是Windows控制台或类UNIX终端

    以下是 @eryksun 了解代码是否正在Windows控制台或类UNIX终端中运行。 标准输出。伊萨蒂 在Windows下运行时,效果有点颠倒,但它确实起到了作用。

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

    请记住,这假设您已经知道代码正在Windows下运行。本文介绍了一种检查操作系统的好方法 here .

    工具书类

    可以找到答案的主要来源 here . 答案的想法属于 @埃里克森 .

    STDOUT.sync , STDOUT.sync = ( question 关于此方法), STDOUT.flush , STDOUT.isatty .