1

我只是想打开一个 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、Ruby 1.8.7、Tcl 8.5.10、Expect 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)
4

2 回答 2

1

Expect 在查找要匹配的内容时搜索的空间可以包括换行符,因此在使用量词时采取措施确保您不会无意中跨行非常重要。例如,我怀疑以下提示更有可能起作用:

设置提示 {(?n)^irb.​​[*">] }

在解析提示的不同部分时,您还可以使用一组更受限制的东西:

设置提示 {(?n)^irb[^\s*">]*[*">] }

编写一个与您想要的完全匹配的正则表达式可能需要相当多的努力;这确实是一门艺术,但是阅读Tcl 的 RE 语法的定义会有很大帮助。(过去 10 年没有太大变化。)


要检查的另一件事是 Windows 上的 Ruby 是否会因文件名中的正斜杠而窒息。如果是这样,您将需要使用file nativename转换:

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

(我不会file join在这种情况下使用。)

于 2011-07-25T20:18:08.960 回答
0

通过查看突出显示的语法,我建议这里的双引号set PROMPT {irb.*[*">] }需要转义。\" 我对红宝石一无所知,如果我错了,请纠正我

于 2011-07-25T16:17:37.463 回答