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 によって検索されるスペースには改行が含まれる可能性があるため、量指定子を使用するときは、誤って行をまたがらないようにすることが重要です。たとえば、次のプロンプトが機能する可能性が高いと思われます。

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

プロンプトのさまざまな部分を解析するときに、より制限されたセットを使用することもできます。

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

必要なものに正確に一致する正規表現を作成するには、かなりの労力が必要になる場合があります。これはちょっとした芸術ですが、Tcl の RE 構文の定義を読むと大いに役立ちます。(ここ10年あまり変わっていません。)


確認すべきもう 1 つのことは、Ruby on Windows がファイル名のスラッシュでチョークするかどうかです。その場合は、次を使用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.*[*">] }をエスケープする必要があることをお勧めします。\" Rubyについては何も知らないので、間違っていたら訂正してください

于 2011-07-25T16:17:37.463 に答える