TCL与stdin的一个问题

TCL与stdin的一个问题,tcl,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 le

考虑到以下准则:

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]
放入“您希望执行什么show命令?”
set cmd[gets stdin]
proc makeLC{str}{
“开始”
卖出$str
设置lStr[字符串小于$str]
设置lStr[字符串修剪$lStr]
将“放在低位和微调之后”
卖出$lStr
set lenStr[字符串长度$lStr]
对于{set i 0}{$i<$lenStr}{incr i}{
puts[字符串索引$lStr$i]
}
返回$lStr
}
设置lcmd[makeLC$cmd]
当用户键入“test12345”时,返回空格以显示“test123”,然后添加“67”以最终显示“test12367” 放置$lStr返回“test12367” 但是“for”循环将显示“test12345 67”,我相信“12345”和“67”之间的空格是“\b\b”

为什么不一致?
我如何确保在传递$lStr时分配了“test12367”而没有分配“test1234567”

请考虑使用哪个包装GNU readline为交互式命令行编辑提供完全支持

另一个依赖于外部工具的解决方案是将对Tcl shell的调用包装为:


通常,Unix上的Tcl程序在终端上以“煮熟”模式运行。烹饪模式终端为您处理所有的行编辑;您只需在生产过程中阅读完成的行即可。使用烹饪模式非常容易。 但您也可以将终端置于原始模式,在该模式下(通常)应用程序决定直接自己处理所有按键。(通常会同时关闭字符回音,以便应用程序处理输出端和输入端。)这就是vi和emacs等编辑器所做的,readline库(在许多程序中使用,如bash)也是如此。使用原始模式要灵活得多,但可以提供更多的控制。与此不同的是,键入的内容是否会被回响以便可以看到;例如,还有非回音模式,这对密码很有用

在您的情况下,听起来很像终端处于原始模式(不寻常!),您的应用程序希望它处于熟食模式;当按下delete键(或者backspace键;下面有很多复杂的东西!)时,你会收到键盘发送的实际字符,这是非常不寻常的。要恢复理智,请执行以下操作:

# No raw, Yes echo
exec stty -raw echo <@stdin >@stdout
#无原始,有回声
执行标准-原始回波@stdout

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

实际上字符串是
test12345\x7f\x7f67
。也许你把输入法设为raw?听起来像是奇怪的终端模式。你在哪个站台?谢谢@库恩,你把我导演得很好。我添加了原始选项,它起了作用。写下你所做的作为一个答案,这样我们可以投票,你会得到一些信用。一旦你们中的任何一个回答,我一定会给你信用。我应该注意到,至少在一个典型的GNU/Linux系统上找到的
stty
版本有
sane
命令,因此可以调用
stty-sane
将终端置于假定的正常状态。
# No raw, Yes echo
exec stty -raw echo <@stdin >@stdout