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

Shell 在屏幕上打印我的tcl脚本运行时完成的百分比?,shell,io,tcl,Shell,Io,Tcl,我有一个tcl脚本,它需要几分钟的时间来运行(执行时间根据不同的配置而不同) 我想让用户知道脚本是否还在执行,以及脚本执行时需要多长时间才能完成 到目前为止,我有一些想法: 1) 用…表示它。。。随着每次内部命令的运行而不断增加。但是,对于第一次使用它的用户来说,它并没有真正给出更多的信息 2) 使用旋转斜杠,我已经看到它使用了很多地方 3) 在屏幕上显示完成输出的实际百分比。不知道这是否可行或如何进行 有没有人知道可以做些什么,以便脚本用户了解发生了什么以及如何做 如果我用…,来实现它,我怎样

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

我想让用户知道脚本是否还在执行,以及脚本执行时需要多长时间才能完成

到目前为止,我有一些想法:

1) 用…表示它。。。随着每次内部命令的运行而不断增加。但是,对于第一次使用它的用户来说,它并没有真正给出更多的信息

2) 使用旋转斜杠,我已经看到它使用了很多地方

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

有没有人知道可以做些什么,以便脚本用户了解发生了什么以及如何做

如果我用…,来实现它,我怎样才能让他们打印这张照片。每次都在同一条线上。如果我在tcl脚本中使用puts来实现这一点,那么。就在下一行打印出来


对于旋转斜线,我需要替换屏幕上已经打印的东西。如何使用tcl实现这一点

首先,打印点出现问题的原因是Tcl正在缓冲其输出,等待新的一行。这通常是一种有用的行为(通常是默认行为),但在这种情况下不需要这样做,因此可以使用以下选项将其关闭:

fconfigure stdout -buffering none
(其他缓冲选项有
,它们提供了逐步提高的缓冲级别,以提高性能,但降低响应能力。) 或者,在打印一个点后,不要冲洗标准输出。(或将点打印到
stderr
,由于主要用于错误消息,因此默认情况下不缓冲。)

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

proc spinner {} {
    global spinnerIdx
    if {[incr spinnerIdx] > 3} {
        set spinnerIdx 0
    }
    set spinnerChars {/ - \\ |}
    puts -nonewline "\r[lindex $spinnerChars $spinnerIdx]"
    flush stdout
}
然后,您需要做的就是定期调用
spinner
。容易的!(此外,完成后在微调器上打印一些内容;只需执行
放置“\r$theOrdinaryMessage”


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

标准输出流最初是行缓冲的,因此在编写换行符、调用或关闭它之前,您不会看到新的输出(这是在脚本退出时自动完成的)。你可以用…关闭缓冲

fconfigure stdout -buffering none

…但是诊断、错误、消息、进度等实际上应该写入流中。默认情况下,它的缓冲设置为“无”,因此您不需要fconfigure。

我尝试在puts中使用-nonewline选项。但这只是在脚本的末尾将所有的点一起打印出来,而不是在执行过程中一个接一个地打印出来。这就是我尝试过的puts-nonewline“。如果你不想在行首使用微调器(或百分比或其他东西),请使用退格字符
\b
,而不是回车。太棒了:)这正是我想要的。FWIW,我从SQLite的创建者那里学到了这个技巧…