2011-07-25 4 views
1

私は単にirbウィンドウを開いてコマンドを入力しようとしています。これは動作するために使用されるが、何とか今それが壊れている:Ruby IRBをTclで作成するExpectは壊れたパイプで悲惨に終わります!

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" 

私は、など、Tclの8.5.10、 は5.43.2を期待 、Rubyの1.8.7

感謝をWindowsXPのSP3、 を使用しています私は二重引用符がここset PROMPT {irb.*[*">] }をエスケープする必要があることを示唆しているシンタックスハイライトを見てから、トム

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) 
+0

この機能はRubyの1.8.6 P26とのTclでうまく働い8.5.9.0そして今それは壊れている。導入されたバグや、方法論の変更があったはずです。トム – Tom

答えて

0

\"私は間違っていると私には分かりませんが、私には間違いがありません。

+0

RegExpが適切であると思われるか、または期待通りのタイムアウトが得られます。 – Tom

+0

@Tom:それはあまりにもあまり一致していないことをどのように知っていますか?サブプロセスが完了するとトリガーするだけですか? –

1

一致するものを探す際にExpectで検索されるスペースには改行が含まれている可能性があります。不注意に行を横切る。例えば、私は、次のプロンプトが動作する可能性が高いと思われる:

set PROMPT {(?n)^irb.*[*">] }
プロンプトの様々な部分解析するときにも、物事のより制限されたセットを使用することができ

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

書き込みをあなたが望むものと正確に一致する正規表現はかなりの労力を要することがあります。それは実際には少し芸術ですが、definition of Tcl's RE syntaxを読むことは多くを助けることができます。 (これは過去10年間であまり変化していない。)


をチェックするためにもう一つは、Windows上でRubyがファイル名にスラッシュにチョークかどうかです。それがない場合は、変換することfile nativenameを使用する必要があります:

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

(私はこのような状況でfile joinを使用して気にしないでしょう。)

+0

正規表現に関しては常にシナプス・タイヤを吹きます。リソースとアドバイスをありがとう。私はあなたの提案を試みたが、壊れたパイプのエラーを取得します。 sendコマンドを実行すると、私のirbセッションが悪意を持って殺害されているようです。ドナルさんありがとう。 – Tom

+0

あなたは '-i $ SPAWN_ID'を残してみることもできると思います。さらに、Windowsの期待はとにかく重大なハックです。プラットフォームには適切な仮想端末システムがないため、Expectはデバッグマジックを使用する必要があります。これがRubyの内部を妨害している可能性があります。 (私はその理論をテストするための適切な設定がありません。) –

関連する問題