Input 如何在TCL中为用户输入创建超时?

Input 如何在TCL中为用户输入创建超时?,input,timeout,tcl,Input,Timeout,Tcl,我有一个很大的TCL脚本,有时会问用户这样的问题,“请输入您的选择:a、B或C?” 用户必须输入字符并按“回车”继续编写脚本。我是否可以在TCL中实现自动化?比如,如果用户在10秒内没有输入任何内容,默认情况下会选择选项A,脚本会继续吗 我环顾四周,似乎TCL接受输入的唯一方式是使用“gets”命令,但这是阻塞,在用户输入某些内容之前不会继续。还有什么我可以用的吗 答复: 科林的回答最终让我找到了我想要的答案(还有一点谷歌搜索)。对那些感兴趣的人来说,这是我最终使用的代码 puts "Are y

我有一个很大的TCL脚本,有时会问用户这样的问题,“请输入您的选择:a、B或C?”

用户必须输入字符并按“回车”继续编写脚本。我是否可以在TCL中实现自动化?比如,如果用户在10秒内没有输入任何内容,默认情况下会选择选项A,脚本会继续吗

我环顾四周,似乎TCL接受输入的唯一方式是使用“gets”命令,但这是阻塞,在用户输入某些内容之前不会继续。还有什么我可以用的吗

答复:

科林的回答最终让我找到了我想要的答案(还有一点谷歌搜索)。对那些感兴趣的人来说,这是我最终使用的代码

puts "Are you happy right now?"
puts "\(Press \"n\" or \"N\" within 5 seconds if you say \"No\"\)\nANSWER:"
global GetsInput
exec /bin/stty raw <@stdin
set id [after 5000 {set GetsInput "Y"}]
fileevent stdin readable {set GetsInput [read stdin 1]}
vwait ::GetsInput
after cancel $id
set raw_data $GetsInput
exec /bin/stty -raw <@stdin
uplevel #0 "unset GetsInput"
set user_input [string toupper $raw_data]

puts "\n"
if [ string equal $user_input "N"] {
    puts "You are making me upset as well!!\n"
} else {
    puts "I'm happy for you too !! (^_^)\n"
}

unset raw_data user_input
显示“你现在快乐吗?”
将“\”(如果您说“不”,请在5秒内按“n”或“n”)\n回答:
全局GetsInput

对于一个整洁的解决方案,Exc/bin /StTuy

见PROC在中间时超时,但注意

  • 它在超时时的操作是
    {put“您睡着了吗?”;exit}
    ,您可能应该将其更改为
    {set GetsInput“我的默认输入”}
  • 这取决于Tcl事件循环中的等待——vwait就是这么做的。嵌入式Tcl安装可能不允许事件循环工作,这取决于它的集成方式
  • 如果您无法实现这一点,那么更粗糙的方法就是:

    fconfigure stdin -blocking 0
    puts -nonewline "Enter data:"
    flush stdout
    after 10000
    gets stdin data
    puts "Got data '$data'"
    

    这将使stdin不阻塞,写入提示,等待10秒,然后读取输入行(如果已输入),如果未输入任何内容,则继续。缺点是,即使用户立即键入输入,它也会等待整整10秒。

    Colin,该wiki代码看起来像是按照我需要的方式运行的(至少,另一个Fedora系统上的测试脚本可以工作)!我将在我的应用程序上试一试,然后给你回复。我做了一些修改,但我得到了我需要的功能。我把它添加到我的问题中,并将其标记为答案。真的,在看到你的回复之前,我本来打算放弃的,科林<代码>包装要求Expect