У меня есть большой TCL-скрипт, который иногда задает пользователю такие вопросы, как «Пожалуйста, введите свой выбор: A, B или C?»
Пользователь должен ввести символ и нажать «Enter», чтобы продолжить сценарий. Могу ли я в любом случае автоматизировать это в TCL? Что-то вроде того, если пользователь ничего не вводит в течение 10 секунд, по умолчанию будет выбран вариант A, и сценарий продолжится?
Я осмотрелся, и кажется, что единственный способ, которым TCL принимает входные данные, - это команда «gets», но это блокирует и не будет продолжаться, пока пользователь что-то не введет. Есть ли что-нибудь еще, что я могу использовать?
ОТВЕЧАТЬ:
Ответ Колина - это то, что в конечном итоге привело меня к ответу, который я искал (вместе с небольшим поиском в Google). Для тех, кто заинтересован, вот код, который я в итоге использовал,
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 секунд, пока пользователь не нажмет клавишу. Он примет ТОЛЬКО 1 ключ в качестве ввода (пользователю не нужно нажимать ввод). Затем он распечатывает ответ. Оператор if просто демонстрирует, как можно принимать решения на основе приведенного выше кода. К лучшему или к худшему, он не будет работать без поддержки "stty" со стороны вашей операционной системы.