0

明らかに欠けているものがあるような気がしますが、これまでの検索は無駄に終わっています。

tcl/expect スクリプトを使用して tclsh インタラクティブ シェルを起動し、テスト用のユーティリティを簡単にリロードする手順を追加してから、通常の制御を私に戻そうとしています。

これまでのところ、Tcl インタラクティブ シェルを「使用可能」にするために私が発見した 1 つの方法は、矢印キーなどを使用できるように「rlwrap」で起動することです。

そこで、次のスクリプトを試してみましたが、rlwrap に関する何かが原因で、interact コマンドがヒットしたときに以前の出力が stdout にダンプされます。

これが起こらないようにするために私にできることはありますか?

コード:

package require Expect


puts "Tcl version   : [info tclversion]"
puts "Expect version: [exp_version]"


log_user 0
spawn -noecho rlwrap tclsh

# Create procedure to easily reload utilites after changes have been made
expect "% "
send {
   proc reload {} {
      # Procedure to reload utility source easily for testing
   }
}

# Source utilities
expect "% "
send "reload\r"

send_user "\nUse 'reload' procedure to re-source utility files\n\n"

log_user 1
interact

出力:

Tcl version   : 8.4
Expect version: 5.43.0

Use 'reload' procedure to re-source utility files


   proc reload {} {
      # Procedure to reload utility source easily for testing
   }
% reload
%  

何らかの理由で、proc 定義と reload コマンドの入力をエコーし​​ている可能性があります。これは、対話が発生するとすぐに発生します。対話を「終了」に置き換えると、この出力は表示されません。

もちろん、私が期待している出力は次のようになります。

Tcl version   : 8.4
Expect version: 5.43.0

Use 'reload' procedure to re-source utility files

%  
4

2 に答える 2

0

あなたがしたいことは、従属プロセスの準備ができていることを示す明確なマーカーを待つことです。

# ... your script as above ...
expect "% "

#### NEW STUFF STARTS ####
send "reload;puts READY\r"
expect "READY\r"

# Note that we need to fake the prompt; c'est la vie
send_user "\nUse 'reload' procedure to re-source utility files\n\n% "

# Now start doing things!
log_user 1
interact

または、少なくとも従属プロセスで試してみるとうまくいきますが、ミックスで rlwrap を使用していなかったので、状況が変わる可能性があります…</p>

于 2013-10-10T19:45:27.850 に答える