用Tcl Expect生成Ruby IRB的悲剧结局是管道破裂!

用Tcl Expect生成Ruby IRB的悲剧结局是管道破裂!,ruby,tcl,pipe,expect,spawn,Ruby,Tcl,Pipe,Expect,Spawn,我只是试图打开一个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"]\

我只是试图打开一个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, 预计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)

从语法突出显示来看,我建议这里的双引号
设置提示符{irb.[*“>]}
需要转义。
\“
我对ruby一无所知,但如果我错了,请纠正我。

从语法突出显示来看,我建议这里的双引号
设置提示符{irb.[*“>}
需要转义。\“我对ruby一无所知,但如果我错了,请纠正我。

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

set PROMPT {(?n)^irb.*[*">] }
(在这种情况下,我不必费心使用
文件联接

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

set PROMPT {(?n)^irb.*[*">] }
(在这种情况下,我不会费心使用
文件联接

RegExp似乎足够了,否则我将从expect获得一个超时。@Tom:你怎么知道它不太匹配,只有在子进程完成后才触发?RegExp似乎足够了,否则我会从expect得到一个超时。@汤姆:你怎么知道它不匹配太多,只有在子进程完成后才触发?我总是对正则表达式感到厌烦;感谢您提供的资源和建议。我已经尝试了你的建议,但仍然得到了管道破裂的错误。当我执行send命令时,似乎有什么肮脏和邪恶的东西正在杀死我的irb会话。谢谢你,多纳尔。我想你也可以试着去掉
-I$SPAWN\u ID
。此外,Windows上的Expect是一个严重的黑客攻击——平台没有合适的虚拟终端系统,因此Expect必须使用调试魔法——这可能会干扰Ruby的内部结构?(我没有一个合适的设置来测试这个理论。)当涉及到正则表达式时,我总是对突触感到厌烦;感谢您提供的资源和建议。我已经尝试了你的建议,但仍然得到了管道破裂的错误。当我执行send命令时,似乎有什么肮脏和邪恶的东西正在杀死我的irb会话。谢谢你,多纳尔。我想你也可以试着去掉
-I$SPAWN\u ID
。此外,Windows上的Expect是一个严重的黑客攻击——平台没有合适的虚拟终端系统,因此Expect必须使用调试魔法——这可能会干扰Ruby的内部结构?(我没有一个合适的设置来测试这个理论。)这个功能在Ruby 1.8.6 p26和Tcl 8.5.9.0上运行良好,现在它被破坏了。一定是引入了一个bug,或者方法上发生了一些变化。Tom这个功能在Ruby 1.8.6 p26和Tcl 8.5.9.0中运行良好,现在它已经崩溃了。一定是引入了一个bug,或者方法上发生了一些变化。汤姆
exp_spawn $RUBY_HOME/bin/ruby.exe [file nativename $RUBY_HOME/bin/irb] --noinspect