порождение Ruby IRB с Tcl Expect трагически кончается в сломанной трубе! - PullRequest
1 голос
/ 25 июля 2011

Я просто пытаюсь открыть окно irb и ввести команды. Раньше это работало, но теперь как-то сломалось:

package require Expect
set exp::winnt_debug 1
set errorInfo

set SPAWN_ID ""
set EXPECT_TIMEOUT 20

set PROMPT {irb.*[*">] }
set RUBY_HOME "C:/ruby/"
exp_spawn [file join $RUBY_HOME "bin" "ruby.exe"]\
                [file join $RUBY_HOME "bin" "irb"] "--noinspect"
set SPAWN_ID $spawn_id
puts $spawn_id

expect {
      -i $SPAWN_ID\
      -timeout $EXPECT_TIMEOUT\
      -re $PROMPT {
         set retVal 1
         puts "retVal 1"
      }
      timeout {
         set retVal 0
         puts "retVal 0"
      }
   }
match_max -i $SPAWN_ID 10000

send -i $SPAWN_ID "Hello World\r"

Я использую WindowsXP SP3, Руби 1.8.7, Tcl 8.5.10, Ожидайте 5.43.2 и т. Д.

Спасибо, Том

irb(main):001:0> retVal 1    
write(spawn_id=]: broken pipe    
    while executing    
"send -i $SPAWN_ID "Hello World\r""    
    (file "TomSpawnRuby.tcl" line 37)

Ответы [ 2 ]

1 голос
/ 26 июля 2011

Пространство, которое Expect ищет при поиске подходящих предметов, может включать в себя новые строки, поэтому важно при использовании квантификаторов предпринимать шаги, чтобы избежать случайного пересечения строк. Например, я подозреваю, что следующая подсказка с большей вероятностью будет работать:

set PROMPT {(?n)^irb.*[*">] }

Вы также можете использовать более ограниченный набор вещей при разборе изменяющейся части приглашения:

set PROMPT {(?n)^irb[^\s*">]*[*">] }

Написание регулярного выражения, которое будет точно соответствовать тому, что вы хотите, может потребовать немало усилий; на самом деле это немного искусство, но чтение определения синтаксиса RE Tcl может очень помочь. (За последние 10 лет он не сильно изменился.)


Еще одна вещь, которую нужно проверить, - задыхается ли Ruby в Windows от прямой косой черты в именах файлов. Если это произойдет, вам нужно будет использовать file nativename для преобразования:

exp_spawn $RUBY_HOME/bin/ruby.exe [file nativename $RUBY_HOME/bin/irb] --noinspect

(я бы не стал использовать file join в этой ситуации.)

0 голосов
/ 25 июля 2011

Посмотрев на подсветку синтаксиса, я бы предложил, что двойная кавычка здесь set PROMPT {irb.*[*">] } должна быть экранирована \" Я ничего не знаю о рубине, хотя поправьте меня, если я не прав

...