TCL与stdin的问题

时间:2013-08-14 23:45:34

标签: tcl

考虑以下代码:

puts "What show command would you like to execute?"
set cmd [gets stdin]

proc makeLC {str} {
   puts "begin"
   puts $str
   set lStr [string tolower $str]
   set lStr [string trim $lStr]
   puts "after low and trim"
   puts $lStr
   set lenStr [string length $lStr]
   for {set i 0} {$i < $lenStr} {incr i} {
      puts [string index $lStr $i]
   }
   return $lStr
}

set lcmd [makeLC $cmd]

当用户键入“test12345”然后退格以显示“test123”然后添加“67”以最终显示“test12367” puts $ lStr返回“test12367” 但是“for”循环将显示“test12345 67”“12345”和“67”之间的空格我认为是“\ b \ b”。

为什么不一致?
以及如何确保在传递$ lStr时分配“test12367”并且“test12345 67”不是

2 个答案:

答案 0 :(得分:2)

通常,Unix上的Tcl程序在“熟”模式的终端中运行。熟食模式终端为您处理所有行编辑;你可以简单地阅读完成的生产线。烹饪模式很容易。 但您也可以将终端置于原始模式,其中(通常)应用程序决定直接处理所有键击。 (通常会同时关闭字符的回显,以便应用程序处理输出端和输入端。)这就是vi和emacs这样的编辑器,readline库也是如此(在许多程序中使用,如庆典)。原始模式是 lot 更加繁琐,但可以提供更多控制权。与此分开的是,所输入的是否被回应以便可以看到;例如,还有非回显烹饪模式,这对密码很有用。

在你的情况下,它听起来非常像终端处于回显原始模式(异常!),你的应用程序希望它处于回显煮熟模式;当你按下删除键时,你得到了从键盘发出的实际角色(或者可能是退格键;那里有很多复杂性!)这是非常不寻常的。要恢复理智,请执行以下操作:

# No raw, Yes echo
exec stty -raw echo <@stdin >@stdout

在Windows上有一些概念上类似的东西,但它通过完全不同的系统调用工作。

答案 1 :(得分:0)

考虑使用包含GNU readline的tclreadline,为交互式命令行编辑提供全面支持。

另一个依赖于外部工具存在的解决方案是将调用包装到rlwrap中的Tcl shell:

rlwrap tclsh /path/to/script/file.tcl