【发布时间】:2013-09-30 08:22:10
【问题描述】:
我正在 tcl 中寻找一种方法来暂停脚本(例如在一些带有“puts”的输出之后)并等待用户按下一个键,然后再继续输出剩余的文本。
【问题讨论】:
-
您确定要将其构建到脚本中吗?有人可能想将输出发送到文件或通过管道将其发送到
grep、sed或其他任何地方。更好的解决方案是将脚本输出通过管道传输到程序之一more(也适用于 Windows)或less。
我正在 tcl 中寻找一种方法来暂停脚本(例如在一些带有“puts”的输出之后)并等待用户按下一个键,然后再继续输出剩余的文本。
【问题讨论】:
grep、sed 或其他任何地方。更好的解决方案是将脚本输出通过管道传输到程序之一 more(也适用于 Windows)或 less。
Windows 的潜在解决方案:
exec -ignorestderr [file join $env(windir) system32 cmd.exe] /c pause
这也会注意到非 ascii 按键(例如箭头键、Escape 等)。
另一个解决方案是Raw Mode on Windows 提出的 多纳尔研究员above (感谢链接!),可以概括为 这两行代码:
twapi::modify_console_input_mode stdin -lineinput 0 -echoinput 0
read stdin 1
这并没有注意到Escape、箭头键之类的(你可能需要稍后恢复控制台输入模式)。
【讨论】:
感谢 Hai Vu 的回答,如果您使用的是类似 unix 的系统,stty
proc anykey {{msg "Hit any key: "}} {
set stty_settings [exec stty -g]
exec stty raw -echo
puts -nonewline $msg
flush stdout
read stdin 1
exec stty $stty_settings
puts ""
}
puts 1
anykey
puts 2
Tcl wiki 上的详细讨论链接:Reading a single character from the keyboard using Tcl
【讨论】:
stty -icanon 具有预期的效果,但不像stty raw 那样严重 - 例如它让用户像往常一样使用^C 退出。
您只需使用gets 从标准输入读取:
proc pause {{message "Hit Enter to continue ==> "}} {
puts -nonewline $message
flush stdout
gets stdin
}
pause "Hurry, hit enter: "; # Sample usage 1
pause; # Sample usage 2, use default message
【讨论】: