LINUX.ORG.RU

Expect


0

0

Добрый день. Подскажите пожалуйста, почему если в этом скрипте
раскомментировать require, то он перестаёт работать (рекурсия).
Tcl8.4 и 8.5.
Что странно: с ActiveState Tcl8.5 скрипт работает.

#package require Expect

proc main {} {
        puts [exec clear]
        puts "1. Ping host"
        puts "2. SSH host"
        puts "3. Status"
        puts "4. Balance."
        puts -nonewline "q. Quit\nEnter choise:"
        set opt [gets stdin]
        switch $opt {
                1 {pingssh $opt}
                2 {pingssh $opt}
                3 {peers}
                4 {balance}
                q {puts "Bye."}
                default {main}
        }
}

main
anonymous

С Expect не работал, как-то это не здорово выглядит из-за рекурсии, она тут не к месту совсем:
вместо default {main}
поставить default {after 10 main}
vwait

Можно тупо так:

while {1} {
 puts [exec clear]
 puts "1. Ping host"
 puts "2. SSH host"
 puts "3. Status"
 puts "4. Balance."
 puts -nonewline "q. Quit\nEnter choice:"
 set opt ""
 while {$opt == ""} {
  after 10
  set opt [string trim [gets stdin]]
  }
 switch $opt {
  1 {pingssh $opt}
  2 {pingssh $opt}
  3 {peers}
  4 {balance}
  q {puts "Bye."; exit}
  default {puts "Unrecognized option. Try again."}
  }
 }

anonymous
()

По-видимому Expect переводит stdin и неблокирующий режим, оттого и идет рекурсия. Достаточно вместо

> set opt [gets stdin]

вставить из предыдущего поста:

> while {$opt == ""} { after 10 set opt [string trim [gets stdin]] }

anonymous
()
Ответ на: комментарий от anonymous

yarr, работает с while {$opt == ""}.
Я просто не могу понять, почему в моём варианте при попытке подключить expect, [gets stdin] не работает.
То есть, он конечно работает, но безо всякого моего участия в switch
что-то передаётся.

anonymous
()
Ответ на: комментарий от anonymous

> Я просто не могу понять, почему в моём варианте при попытке подключить expect, [gets stdin] не работает. То есть, он конечно работает, но безо всякого моего участия в switch что-то передаётся.

Я говорю, expect перевел stdin в неблокирующий режим. Поэтому, когда ты читаешь его, а в буфере пусто, то gets не ждет, пока юзер что-то введет, а сразу возвращает пустую строку. Как следствие, пустая строка попадает в switch и идет на default. а дальше у тебя - рекурсия. А вот если бы stdin остался в блокирующем режиме, gets бы терпеливо ожидал ввода.

anonymous
()
Ответ на: комментарий от anonymous

Да, видимо всё так и есть.
В стандартном Tcl8.5 фокус fconfigure stdin -blocking 1 не работает 
А у парней из ActiveState это поведение Expect починено.
Спасибо.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.