在输入行之间暂停终端

时间:2013-10-28 20:21:12

标签: tcl stdin onpause

我正在寻找一种方法来标记每个条目之间的暂停,让脚本在进一步检查之前检查每个条目。

例如,我有这个简单的代码:

for {set i 0} {$i<5} {incr i} {
  set x [gets stdin]
  if {[string is integer -strict $x]} {
      puts "It's OK"
  } else {
      puts "It's not OK"
  }
}

使用此代码,如果我手动逐条输入,脚本有时间检查每个条目,这是输出:

5
It's OK
dd
It's not OK
kk
It's not OK
55
It's OK
99
It's OK

但现在如果我复制/粘贴:

5
dd
kk
55
99

现在是输出:

5
dd
kk
55
99
It's OK
It's not OK
It's not OK
It's OK
It's OK

有没有办法在每次输入后给出足够的时间让脚本有时间进行检查才能进入下一个条目?

谢谢。

2 个答案:

答案 0 :(得分:1)

这令人惊讶地难以做到。原因如下:粘贴文本的输出实际上是由OS(它是终端仿真的一部分)在进入Tcl之前处理的。虽然您可以做一些事情(通常通过使用正确的选项调用exec /bin/stty),但实际上并没有那么多帮助。例如,您可以关闭值的回显并完全按照所做的那样处理所有击键(这是-echoraw选项),但是这样你就不得不做很多工作来假装这些东西仍处于熟食模式(-raw),因为它提供了正常的终端输入。 这是很多的工作。

理论上,像readline这样的图书馆会有所帮助:他们已经为你做了邪恶的黑客攻击。除了在特定的情况下,它们没有帮助,因为您想要的严格交错模型不是一个通用的要求。

我在你的位置上实际做的是重写输出,以便它说明每次检查的输入,以及结果(“"5" is OK”)然后我可以取值从一个文件中解析出来并且最终能够在没有大惊小怪的情况下弄清楚发生了什么。

答案 1 :(得分:0)

在其中添加puts $x,或更改消息:

for {set i 0} {$i<5} {incr i} {
  set x [gets stdin]
  set ok [string is integer -strict $x]
  puts [format {%s %s OK} $x [expr {$ok ? "is" : "is not"}]]
}