考虑以下代码:
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”不是
答案 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