shell - 当我的 tcl 脚本运行时,在屏幕上打印完成的百分比?

标签 shell io tcl

我有一个 tcl 脚本,需要几分钟才能运行(执行时间根据不同的配置而变化)。

我希望用户对脚本执行时是否仍在执行以及需要多长时间才能完成有某种了解。

到目前为止我的一些想法:

1) 使用 ... 来表示它,它随着每个内部命令运行而不断增加。但同样,它并没有真正让第一次用户知道还有多少东西可以做。

2)使用我在很多地方都见过的旋转斜线。

3) 在屏幕上输出实际完成的百分比。不知道这是否可行或如何进行。

有谁知道可以做什么,以便脚本的用户了解正在发生的事情以及如何做到这一点?

此外,如果我使用 ... 来实现它,我如何让他们打印 .每次都在同一条线上。如果我在 tcl 脚本中使用 put 来执行此操作,.只是打印在下一行。

对于旋转斜线,我需要替换已经打印在屏幕上的内容。我怎样才能用tcl做到这一点?

最佳答案

首先,打印点时遇到问题的原因是 Tcl 正在缓冲其输出,等待新行。这通常是一个有用的行为(通常足以成为默认行为),但在这种情况下不需要它,因此您可以通过以下方式将其关闭:

fconfigure stdout -buffering none

(其他缓冲选项是 linefull,它们提供逐渐更高级别的缓冲,以提高性能,但会降低响应能力。) 或者,在打印点后刷新标准输出。 (或者将这些点打印到 stderr,默认情况下它是无缓冲的,因为主要用于错误消息。)

制作旋转器并不比打印点困难多少。关键技巧是使用回车符(不可打印的字符,有时可视化为 ^M)将光标位置移回行首。将微调器代码分解为一个小过程是件好事:

proc spinner {} {
    global spinnerIdx
    if {[incr spinnerIdx] > 3} {
        set spinnerIdx 0
    }
    set spinnerChars {/ - \\ |}
    puts -nonewline "\r[lindex $spinnerChars $spinnerIdx]"
    flush stdout
}

然后您所需要做的就是定期调用spinner。简单的! (此外,完成后在旋转器上打印一些内容;只需执行 puts "\r$theOrdinaryMessage" 即可。)

一直到实际的进度表很好,它建立在这些技术的基础上,但它要求您计算出需要进行多少处理等等。旋转器更容易实现! (特别是如果您还没有确定需要完成多少工作。)

关于shell - 当我的 tcl 脚本运行时,在屏幕上打印完成的百分比?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13835717/

相关文章:

objective-c - 从 shell 脚本读取实时输出并更新进度条

linux - 我怎样才能使用shell脚本在linux中获取所有用户及其authorize_key?

c - 使用C中的fgets()函数检测到堆栈崩溃

python - 使用 TCL 扩展在 Tkinter 中设置 native 窗口样式

tcl - Modelsim仿真起止时间

bash: ????: 找不到命令

linux - 执行此 'mv' 命令后我的文件发生了什么?

java - 获取 BufferedReader 读取的文件中的偏移量?

打开文件时出现 C 段错误

tcl - 带有运算符 eq 的 TCL 命令 expr 背后的魔法是什么