使用ruby在命令提示符中写入以前的输出行

Ale*_*yne 20 ruby command-line

我运行输出一行的命令行程序,然后稍后更新该行.但是对于ruby,我似乎只能输出一行,然后是另一行.

我现在输出的是什么:

Downloading file:
11MB 294K/s
12MB 307K/s
14MB 294K/s
15MB 301K/s
16MB 300K/s
Done!
Run Code Online (Sandbox Code Playgroud)

相反,我想看到这个:

Downloading file:
11MB 294K/s
Run Code Online (Sandbox Code Playgroud)

过了一会儿:

Downloading file:
16MB 300K/s
Done!
Run Code Online (Sandbox Code Playgroud)

我的ruby脚本输出的行显示下载的文件大小和传输速度,每次都会被覆盖,而不是将更新的值列为整个新行.

我目前正在使用puts生成输出,显然不是为这种情况设计的.是否有不同的输出方法可以实现这一结果?

det*_*zed 39

使用\r将光标移动到该行的开头.并且您不应该使用,puts因为它添加\n,使用print相反.像这样:

print "11MB 294K/s"
print "\r"
print "12MB 307K/s"
Run Code Online (Sandbox Code Playgroud)

但要注意的一件事是:\r删除任何东西,它只是将光标向后移动,因此您需要用空格填充输出以覆盖先前的输出(如果它更长).

默认情况下,当\n打印到标准输出时,将刷新缓冲区.现在您可能需要使用STDOUT.flushafter print来确保文本立即打印出来.

  • "在输出换行符或程序结束之前,此解决方案不显示输出"这是操作系统中的故意设计决策,以缓冲写入以更有效地使用I/O通道.有时我们需要立即写入数据,因此能够使用`flush`强制刷新.像你这样想要立即写入所有STDOUT的应用程序的更好的解决方案是使用`STDOUT.sync = true`.STDOUT将禁用缓冲,无需使用`flush`.如果要重新启用缓冲,请将其设置为"false". (5认同)