Skip to main content

Linux / Unixのコマンドと例を期待する

Writing 2D Games in C using SDL by Thomas Lively (六月 2026)

Writing 2D Games in C using SDL by Thomas Lively (六月 2026)
Anonim

Expectは、スクリプトに従って他の対話型プログラムと会話するプログラムです。スクリプトに続いて、Expectはプログラムから何が期待できるのか、そして正しい応答が何であるべきかを知っています。インタプリタ言語は、ダイアログを指示するための分岐および高水準の制御構造を提供します。さらに、ユーザは、必要なときに制御を行い、直接対話し、その後に制御をスクリプトに戻すことができる。

ExpectkはExpectとTkが混在しています。 ExpectとTkの希望と同じように動作します。 Expectは、TclなしでCまたはC ++で直接使用することもできます。

"Expect"という名前は、uucp、kermit、および他のモデム制御プログラムによって一般化されたsend / expectシーケンスのアイデアから来ています。しかし、uucpとは異なり、Expectはあらゆるプログラムとタスクを念頭に置いてユーザーレベルのコマンドとして実行できるように一般化されています。 Expectは同時に複数のプログラムと話すことができます。

期待できること

たとえば、expectコマンドでできることは次のとおりです。

  • あなたのコンピュータがあなたに電話をかけるので、通話料金を支払わずにログインすることができます。
  • ゲームを開始し、最適な構成が表示されない場合は、それが繰り返されるまで何度も再起動してください。
  • fsckを実行し、その質問に答えて、所定の基準に基づいて「はい」または「いいえ」と答えるか、制御を戻します。
  • 別のネットワークに接続し、ローカルシステムに送信されたようにメールを自動的に取得します。
  • 環境変数、現在のディレクトリ、またはrlogin、telnet、tip、su、またはchgrpのあらゆる種類の情報を持ち歩く

シェルがこれらのタスクを実行できないさまざまな理由があります。すべてはExpectで可能です。

一般に、Expectは、プログラムとユーザーとのやりとりを必要とするプログラムを実行する場合に便利です。必要なのは、相互作用をプログラム的に特徴付けることだけである。 Expectは、制御されているプログラムを停止させることなく、ユーザーに制御を戻すこともできます。同様に、ユーザーはいつでもスクリプトに制御を戻すことができます。

使用法

Expectはcmdfileを読み込み、実行するコマンドのリストを取得します。 Expectは#!をサポートするシステム上で暗黙的に呼び出されるかもしれません。スクリプトを実行可能ファイルとしてマークし、スクリプトの最初の行を作成することにより、

#!/ usr / local / bin / expect -f

もちろん、パスはExpectがどこに住んでいるかを正確に記述する必要があります。 / usr / local / binは単なる例です。

-cフラグは、スクリプト内のanyより前に実行されるコマンドに先行します。このコマンドは、シェルによって分割されないように引用符で囲む必要があります。このオプションは複数回使用できます。複数のコマンドは、セミコロンで区切って-cオプションを付けて実行することができます。コマンドは表示された順序で実行されます。 Expectkを使用する場合、このオプションは-commandとして指定されます。

-dフラグは、何らかの診断出力を有効にします。これは主にexpectやinteractなどのコマンドの内部動作を報告します。このフラグは、Expectスクリプトの先頭にある "exp_internal 1"と同じ効果を持ち、Expectのバージョンが出力されます。

-Dフラグは、対話式デバッガーを使用可能にします。整数値が続くはずです。デバッガは、値がゼロ以外の場合、または^ Cが押された場合やブレークポイントがヒットした場合、またはスクリプトに他の適切なデバッガコマンドが表示された場合に、次のTclプロシージャの前に制御を受けます。 Expectkを使用する場合、このオプションは次のように指定されます。 -デバッグ。

-fフラグは、コマンドを読み取る元のファイルに先行します。 #!を使用する場合にのみ便利なので、フラグ自体はオプションです。他の引数がコマンドラインで提供されるようにします。 Expectkを使用する場合、このオプションは-fileとして指定されます。

デフォルトでは、コマンドファイルはメモリに読み込まれ、その全体が実行されます。一度に1行ずつファイルを読むことが望ましい場合があります。このように任意のファイルを強制的に処理するには、-bフラグを使用します。 Expectkを使用する場合、このオプションは-bufferとして指定されます。

文字列 " - "がファイル名として提供された場合は、代わりに標準入力が読み込まれます。実際に " - "という名前のファイルから読み込むには "./-"を使用します。

-iフラグを指定すると、Expectはファイルから読み込むのではなく対話形式でコマンドを要求します。プロンプトは、exitコマンドまたはEOFで終了します。コマンド・ファイルも-cも使用されていない場合は、-iフラグが仮定されます。 Expectkを使用する場合、このオプションは-interactiveとして指定されます。

- オプションの終わりを区切るために使用することができます。これは、Expectによって解釈されることなくオプションのような引数をスクリプトに渡したい場合に便利です。これは便利に#に置くことができます! Expectによる旗のような解釈を防ぐための行です。たとえば、次の例では、スクリプト名を含む元の引数は変数に残ります argv .

#!/ usr / local / bin / expect -

#!に引数を追加するときは、通常のgetopt(3)とexecve(2)の規則を遵守しなければならないことに注意してください。ライン。

ファイル$ exp_library / expect.rcは、-Nフラグが使用されていない限り、自動的にソースされます。 (Expectkを使用している場合、このオプションは-NORCとして指定されています)。この直後に、〜/ .expect.rcファイルは、-nフラグが使用されていない限り自動的にソースされます。環境変数DOTDIRが定義されている場合は、ディレクトリとして扱われ、そこから.expect.rcが読み込まれます。 Expectkを使用する場合、このオプションは-norcとして指定されます。このソースは、-cフラグを実行した後でのみ発生します。

-vは、Expectにバージョン番号を出力して終了させます。長いフラグ名を使用するExpectkの対応するフラグは-versionです。

オプションのargsはリストに構成され、argvとargという名前の変数に格納されます。 argcはargvの長さに初期化されます。

Argv0は、スクリプトが使用されていない場合、スクリプトまたはバイナリの名前であると定義されています。たとえば、スクリプトの名前と最初の3つの引数を次のように出力します。

send_user "$ argv0 lrange $ argv 0 2 n"

コマンド

ExpectはTool Command Languageを使用します。 Tclは、制御フロー(if、for、break)、式評価、および再帰やプロシージャ定義などのいくつかの他の機能を提供します。ここで使用されていても定義されていないコマンド(set、if、exec)はTclコマンドです。 Expectは追加のコマンドをサポートしています。特に指定しない限り、コマンドは空文字列を返します。

コマンドはアルファベット順にリストされているので、コマンドを素早く見つけることができます。しかし、新しいユーザーは、spawn、send、expect、およびinteractの説明をこの順番で読むことで、開始が容易になる場合があります。

閉じる-slave -onexec 0 | 1 -i spawn_id

現在のプロセスへの接続を閉じます。ほとんどのインタラクティブなプログラムは、標準と出口でEOFを検出します。したがって 閉じる 通常はプロセスを終了するのにも十分です。 -iフラグは、指定されたspawn_idに対応するプロセスを閉じることを宣言します。

expectとinteractは、現在のプロセスが終了して暗黙のうちに終了したことを検出しますが、例えば "exec kill $ pid"というプロセスを終了すると、明示的にcloseを呼び出す必要があります.

-onexecフラグは、生成された新しいプロセスでspawn idがクローズされるかどうか、またはプロセスがオーバーレイされるかどうかを決定します。スポーンIDを開いたままにするには、値0を使用します。ゼロ以外の整数値は、新しいプロセスでスポーンを強制的に閉じます。

-slaveフラグは、spawn idに関連付けられたスレーブを閉じます。接続が閉じられると、スレーブはまだ開いていれば自動的に閉じられます。

暗黙的または明示的に接続が閉じられているかどうかにかかわらず、waitを呼び出して対応するカーネルプロセススロットをクリアする必要があります。 closeコマンドは、プロセス接続を閉じることで終了する保証がないため、waitを呼び出さない。

デバッグ-now 0 | 1

ステートメントをステップ実行してブレークポイントを設定できるようにするTclデバッガーを制御します。

引数がない場合は、デバッガが実行されていない場合は1が返され、それ以外の場合は0が返されます。

1つの引数を指定すると、デバッガが起動します。引数が0の場合、デバッガは停止します。 1つの引数の前に-nowフラグが指定されていると、デバッガはただちに起動します。それ以外の場合、デバッガは次のTcl文で起動されます。

debugコマンドはトラップを変更しません。これを-DフラグでExpectを開始することと比較してください。

切断コマンドは、フォークされたプロセスを端末から切断します。それはバックグラウンドで実行し続けます。プロセスには独自のプロセスグループが与えられます。標準I / Oは/ dev / nullにリダイレクトされます。

次のフラグメントは、disconnectを使用してバックグラウンドでスクリプトを実行し続けます。

if {fork!= 0}切断を終了します。 。 。

次のスクリプトは、パスワードを読み取り、実行するたびにパスワードを要求するプログラムを1時間ごとに実行します。スクリプトはパスワードを入力するので、一度だけ入力するだけです。

{$ 1} $ {{fork}!= 0}の場合{sleep 3600; continue}スポーンを切断するpriv_prog expectパスワード: "$ expect_out( 1、文字列) r " 。 。出口 }

シェルの非同期処理機能(&)での切断を使用する利点は、切断する前にターミナルパラメータを保存し、後でそれらを新しいptysに適用できることです。 Expectは、Expectが制御を受け取るまでに端末が既に切断されているため、端末のパラメータを読み取る機会はありません。

exit -opts status

Expectを終了させたり、そうするように準備したりします。

- 一人 フラグを指定すると、次の引数が終了ハンドラとして使用されます。引数がなければ、現在の終了ハンドラが返されます。

-出口なし フラグの原因 期待 終了する準備をするが、実際にオペレーティングシステムに制御を戻すことはできません。ユーザー定義の終了ハンドラは、Expect自身の内部ハンドラと同様に実行されます。それ以上のExpectコマンドは実行されません。 Expectを他のTcl拡張で実行している場合に便利です。現在のインタプリタ(およびTk環境の場合はメインウィンドウ)は、他のTcl拡張がクリーンアップできるように残っています。 Expectの 出口 (これが発生する可能性があります)、ハンドラは再実行されません。

終了すると、生成されたプロセスへのすべての接続が閉じられます。クローズは、生成されたプロセスによってEOFとして検出されます。 出口 通常の_exit(2)プロシージャが行う以外のアクションは行いません。したがって、EOFをチェックしない生成されたプロセスは引き続き実行される可能性があります。 (さまざまな条件は、生成されたプロセスにどのような信号が送られるかを判断するのに重要ですが、システム依存です(通常はexit(3)でドキュメント化されています)。実行を継続する生成プロセスはinitによって継承されます。

状態 (指定されていない場合は0)が終了ステータスとして返されます。 期待 . 出口 スクリプトの終わりに達すると暗黙的に実行されます。

exp_continue -continue_timer

コマンド exp_continue 許す 期待する 通常通りに戻るのではなく、実行を継続することができます。デフォルトでは exp_continue タイムアウトタイマーをリセットします。ザ -continue_timer フラグはタイマーの再起動を防ぎます。 (見る 期待する 詳細については。)

exp_internal -fファイルの値

さらなるコマンドが診断情報を内部に送信するようにします。 期待 if stderr if 値 ゼロ以外です。この出力は、 値 診断情報には、受信したすべての文字と、現在の出力をパターンと照合するすべての試行が含まれます。

オプションの ファイル が供給されていれば、すべての通常のデバッグ出力が(その値に関係なく)そのファイルに書き込まれます。 値 )。以前の診断出力ファイルは閉じられています。

-info flagは、exp_internalに与えられた最新の非情報引数の記述を返します。

exp_open args -i spawn_id

元のスポーンIDに対応するTclファイル識別子を返します。ファイル識別子は、Tclによって開かれたかのように使用できます。 開いた コマンド。 (スポーンidはもはや使用されるべきではありません。 待つ 実行されるべきではない。

-leaveopen フラグは、spawn idをExpectコマンドを介してアクセスするために開いたままにします。 A 待つ spawn idで実行する必要があります。

exp_pid -i spawn_id

現在生成されているプロセスに対応するプロセスIDを返します。もし -私 フラグが使用された場合、返されたpidは、指定されたspawn idの戻り値に対応します。

exp_send

のエイリアスです 送信する .

exp_send_error

のエイリアスです send_error .

exp_send_log

のエイリアスです send_log .

exp_send_tty

のエイリアスです send_tty .

exp_send_user

のエイリアスです send_user .

exp_version -exit version

スクリプトが現在のバージョンのExpectと互換性があることを確認するのに便利です。

引数なしでは、現在のバージョン 期待 返されます。このバージョンは、あなたのスクリプトにコード化されるかもしれません。最近のバージョンの機能を使用していないことが実際に分かっている場合は、以前のバージョンを指定できます。

バージョンはドットで区切られた3つの数字で構成されています。最初はメジャー番号です。バージョンのために書かれたスクリプト 期待 別のメジャー番号ではほとんど確実に機能しません。 exp_version メジャー番号が一致しない場合はエラーを返します。

2番目はマイナー番号です。現在のバージョンよりも大きなマイナー番号を持つバージョン用に作成されたスクリプトは、新しい機能に依存する可能性があり、実行されない可能性があります。 exp_version メジャー番号が一致してもスクリプトのマイナー番号が実行中のものよりも大きい場合はエラーを返します 期待 .

3番目は、バージョンの比較に関与しない数字です。ただし、 期待 ソフトウェア配布は、追加の文書化や最適化など、何らかの方法で変更されます。新しいマイナーバージョンごとに0にリセットされます。

とともに -出口 フラグ、 期待 バージョンが古い場合はエラーを出力して終了します。

-opts pat1 body1 … -opts patn bodynを期待する

パターンの1つが生成されたプロセスの出力と一致するか、指定された時間が経過するか、またはファイルの終わりが見えるまで待ちます。最後のボディが空の場合は、省略することができます。

最近のパターン expect_before コマンドは他のパターンの前に暗黙的に使用されます。最近のパターン expect_after コマンドは、他のパターンの後で暗黙的に使用されます。

引数全体が 期待する 文が複数の行を必要とする場合、各行をバックスラッシュで終了させないように、すべての引数を1つに "補強"することができます。この1つのケースでは、中括弧にもかかわらず通常のTcl置換が行われます。

パターンがキーワードの場合 eof 対応する本文は、ファイルの終わりに実行されます。パターンがキーワードの場合 タイムアウト タイムアウト時に対応する本体が実行されます。 timeoutキーワードを使用しない場合、タイムアウト時に暗黙のヌルアクションが実行されます。デフォルトのタイムアウト時間は10秒ですが、「set timeout 30」コマンドで30に設定できます。無限のタイムアウトは値-1で指定することができます。パターンがキーワードの場合 デフォルト タイムアウトまたはファイルの終わりのいずれかで、対応する本体が実行されます。

パターンが一致すると、対応する本体が実行されます。 期待する 本文の結果を返します(パターンが一致しない場合は空文字列)。複数のパターンが一致する場合は、最初に表示されたパターンがボディを選択するために使用されます。

新しい出力が到着するたびに、それは各パターンとリストされた順序で比較されます。したがって、プロンプトのように、最後のパターンを何かが出現することを保証することによって、一致がないかどうかをテストすることができます。プロンプトが表示されない状況では、 タイムアウト (あなたが手動で対話していた場合と同じように)。

パターンは3つの方法で指定されます。デフォルトでは、パターンはTclのように指定されます 文字列の一致 コマンド。 (このようなパターンは、通常、「glob」パターンと呼ばれるCシェルの正規表現にも似ています)。ザ -gl フラグは、そうでなければ一致する可能性のあるパターンを保護するために使用されてもよい 期待する そうすることからの旗。 " - "で始まるパターンは、このように保護する必要があります。 ( " - "で始まるすべての文字列は将来のオプション用に予約されています)。

たとえば、次のフラグメントは正常なログインを探します。 (ご了承ください アボート スクリプト内の他の場所で定義されている手順と見なされます)。

{ビジー{ビジー n; exp_continue}失敗abort "無効なパスワード" abort timeout abort connected}

4番目のパターンには引用符が必要です。スペースが含まれているため、アクションからパターンを分離することになります。同じアクション(3番目と4番目など)のパターンは、アクションを再度リストする必要があります。これは、regexp形式のパターンを使用することで回避できます(下記参照)。グロブスタイルのパターンを形成する方法の詳細は、Tclのマニュアルを参照してください。

正規表現形式のパターンは、Tclの定義した構文に従います 正規表現 ( "正規表現"の略)コマンドです。正規表現のパターンがフラグとともに導入されました -re 。前の例はregexpを使って次のように書き直すことができます:

{ビジー{ビジー n; exp_continue} -re "無効なパスワード" abort timeout abort connected}

両方のタイプのパターンは「アンカーされていない」。つまり、パターンは文字列全体に一致する必要はありませんが、文字列内の任意の場所にマッチを開始したり終了したりすることができます。文字列の先頭に一致するには^を使用し、最後に一致させるには$を使用します。文字列の終わりを待たない場合、応答は生成されたプロセスからエコーされるので、文字列の途中で簡単に終わる可能性があることに注意してください。それでも正しい結果が得られれば、出力は不自然に見えます。したがって、文字列の最後に文字を正確に記述することができれば、$を使用することをお勧めします。

多くのエディタでは、^と$がそれぞれ行頭と終わりに一致することに注意してください。ただし、expectは行指向ではないため、これらの文字は、現在期待一致バッファ内にある(行ではなく)データの先頭と末尾に一致します。 (また、以下の「システム消化不良」の注記を参照してください)

-ex flagはパターンを "正確な"文字列としてマッチさせます。 *、^などは解釈されません(ただし、通常のTcl規​​則はまだ守られていなければなりません)。正確なパターンは常にアンカーされています。

-nocase フラグを指定すると、出力の大文字が小文字のように比較されます。パターンは影響を受けません。

出力を読み込んでいる間に、2000バイト以上で、以前のバイトを強制的に「忘れてしまいます」。これは関数で変更することができます match_max 。 (値が大きすぎるとパターンマッチャーが遅くなることがあります)。 patlist は full_buffer 場合は、対応するボディが実行されます。 match_max バイトが受信され、他のパターンは一致しません。かどうか full_buffer キーワードが使用されている場合、忘れた文字はexpect_out(バッファ)に書き込まれます。

もし patlist キーワードです ヌル 、nullは許可されます( remove_nulls コマンド)、1つのASCII 0がマッチすると、対応する本体が実行されます。 globまたはregexpパターンで0バイトを照合することはできません。

パターン(またはeofまたはfull_buffer)を一致させると、一致していて以前に一致しなかった出力が変数に保存されます expect_out(バッファ) 。最大9つの正規表現の部分文字列一致が変数に保存されます expect_out(1、string) を通して expect_out(9、string) 。もし -indices フラグはパターンの前に使用され、開始および終了のインデックス( 不思議 )を変数に格納する expect_out(X、start) そして expect_out(X、end) Xは数字で、バッファ内の部分文字列の位置に対応します。 0はパターン全体にマッチしたストリングを指し、globパターンとregexpパターンに対して生成されます。たとえば、プロセスが "abcdefgh n"の出力を生成した場合、次の結果が得られます。

CDを期待する

次のような文が実行されたかのようです。

set expect_out(0、string)cd set expect_out(buffer)abcd

出力バッファには "efgh n"が残っています。プロセスが出力 "abbbabckkka n"を生成した場合、次の結果が得られます。

expect -indices -re "b(b *)。*(k +)"

次のような文が実行されたかのようです。

(0、文字列)3 expect_out(1、string)3 set expect_out(1、string)bbセットのexpect_out(0、文字列) (2、start)10 set expect_out(2、end)10 expect_out(2、string)kセットexpect_out(バッファ)abbbcabkkkk

出力バッファには "a n"が残っています。パターン "*"(および-re "。*")は、プロセスからの出力をもう読まずに出力バッファをフラッシュします。

通常、一致した出力はExpectの内部バッファから破棄されます。これは、パターンの前に 非移転 フラグ。このフラグは、実験で特に便利です(実験中は便宜上「 - なし」と省略できます)。

一致する出力(またはeofまたはfull_buffer)に関連付けられたスポーンIDは、 expect_out(spawn_id) .

-タイムアウト 現在のexpectコマンドは、timeout変数の値を使用する代わりに、次の値をタイムアウトとして使用します。

デフォルトでは、パターンは現在のプロセスの出力と照合されますが、 -私 flagは、指定されたspawn_idリストからの出力が次のパターンと一致することを宣言します(次のパターンまで -私 )。 spawn_idリストは、空白で区切られたspawn_idのリストか、そのようなspawn_idsのリストを参照する変数のいずれかでなければなりません。

たとえば、次の例では、現在のプロセスから "connected"、または$ proc2で指定されたspawn_idから "busy"、 "failed"または "invalid password"を待ちます。

{-i $ proc2 busy {puts busy n; exp_continue} -re "無効なパスワード" abort timeout abort connected}

グローバル変数の値 any_spawn_id 他のすべての名前で指定されたspawn_idにパターンを一致させるために使用できます -私 現在のフラグ 期待する コマンド。 aからのspawn_id -私 パターンが関連付けられていない(すなわち、すぐに別のパターンが続く)フラグ -私 )は、同じパターン内の他のパタ​​ーン 期待する 関連するコマンド any_spawn_id。

-私 flagはグローバル変数に名前をつけることもできます。その場合、変数はスポーンIDのリストのために読み込まれます。変数は変更されるたびに再度読み込まれます。これにより、コマンドの実行中にI / Oソースを変更する方法が提供されます。このように提供されたスポーンIDは、「間接」スポーンIDと呼ばれます。

次のようなアクション ブレーク そして 持続する 制御構造(すなわち、 にとって , proc )通常のやり方で行動する。コマンド exp_continue 許す 期待する 通常通りに戻るのではなく、実行を継続することができます。

これは、明示的なループや繰り返しのexpect文を避けるのに便利です。以下の例は、rloginを自動化するための断片の一部です。ザ exp_continue 二度目の書き込みを避ける 期待する rloginがパスワードの入力を求めるプロンプトが表示された場合は、(プロンプトをもう一度検索する)文を入力します。

$ hostに "{stty -echo send_user"}パスワードを入れてください: "expect_user -re"(。*) n "send_user" n "send" $ expect_out(1、string) r "sttyホストへの接続に失敗しました:$ expect_out(バッファ) "exit} - ホストへの接続が失敗しました n" re $ prompt}

たとえば、次の部分は、すでに完全に自動化された操作をユーザーがガイドするのに役立ちます。この場合、端末はrawモードになります。ユーザーが "+"を押すと、変数がインクリメントされます。 "p"を押すと、いくつかの戻り値がプロセスに送られ、何らかの方法でそれを突き止めることができます。 "i"はプロセスと対話し、スクリプトから制御を奪ってしまいます。いずれの場合も、 exp_continue 電流を許容する 期待する 現在のアクションを実行した後にパターンマッチングを続ける。

stty raw -echo expect_after {-i $ user_spawn_id "p" {" r r r"; exp_continue} "+" {incr foo; exp_continue} "i" {interact; exp_continue} "終了"}

デフォルトでは、 exp_continue タイムアウトタイマーをリセットします。タイマーは再起動されません。 exp_continue と呼ばれる -continue_timer フラグ。

expect_after expect_args

は、 expect_before ただし、両方のパターン 期待する そして expect_after 一致することができます 期待する パターンが使用されます。を参照してください expect_before 詳細については、コマンドを参照してください。

expect_background expect_args

同じ引数を取る期待する しかし、すぐに戻ります。新しい入力が到着するたびにパターンがテストされます。パターンタイムアウト そしてデフォルト 意味がないexpect_background 静かに捨てられます。それ以外の場合、expect_background コマンド使用expect_before そしてexpect_after ちょうど好きなパターン期待する そうです。

いつexpect_background アクションが評価されている場合、同じスポーンIDのバックグラウンド処理はブロックされます。アクションが完了すると、バックグラウンド処理はブロック解除されます。バックグラウンド処理はブロックされていますが、(フォアグラウンド)期待する 同じスポーンIDで

実行することはできません期待する 一方、expect_background ブロックされていません。expect_background 特定のスポーンのidは、同じスポーンidを持つ新しいexpect_backgroundを宣言することによって削除されます。宣言expect_background パターンを持たない場合、指定されたスポーンIDはバックグラウンドでパターンにマッチする能力から削除されます。

expect_before expect_args

同じ引数を取る期待する しかし、すぐに戻ります。最新のパターン・アクション・ペアexpect_before 同じスポーンidを持つすべての要素は、次のいずれかに暗黙的に追加されます期待する コマンド。パターンが一致すると、パターンが指定されたものとして扱われます。期待する コマンドそのものであり、関連する本体は、期待する コマンド。両方からのパターンexpect_before そして期待する 一致することができますexpect_before パターンが使用されます。

パターンが指定されていない場合、スポーンidはどのパターンでもチェックされません。

によって上書きされない限り-私 フラグ、expect_before パターンは、その時点で定義されたスポーンidと一致しますexpect_before コマンドが実行されました(パターンが一致していない場合)。

-infoフラグが原因ですexpect_before どのパターンの現在の仕様を返すかを指定します。デフォルトでは、現在のスポーンIDを報告します。オプションで、spawn idに関する情報を指定することができます。例えば

expect_before -info -i $ proc

多くの場合、1つのspawn id指定が与えられます。フラグ-indirectは、間接的な指定のみから来る直接スポーンIDを抑制します。

スポーンID仕様の代わりに、フラグ "-all"を指定すると、すべてのスポーンIDについて "-info"がレポートされます。

-infoフラグの出力は、expect_beforeの引数として再利用できます。

expect_tty expect_args

のようなものです期待する それは/ dev / tty(すなわち、ユーザからのキーストローク)から文字を読み込みます。デフォルトでは、読み取りはcookedモードで実行されます。したがって、行は次の順序でリターンで終了する必要があります。期待する それらを見る。これはによって変更される可能性がありますsttystty 以下のコマンド)。

expect_user expect_args

のようなものです期待する stdinからの文字(つまり、ユーザーからのキーストローク)を読み込みます。デフォルトでは、読み取りはcookedモードで実行されます。したがって、行は次の順序でリターンで終了する必要があります。期待する それらを見る。これはによって変更される可能性がありますsttystty 以下のコマンド)。

フォーク

新しいプロセスを作成します。新しいプロセスは現在の正確なコピーです期待 プロセス。成功すると、フォーク 新しい(子)プロセスに0を返し、子プロセスのプロセスIDを親プロセスに返します。失敗した場合(常にスワップスペースやメモリなどのリソースが不足しているため)、フォーク 親プロセスに-1を返し、子プロセスは作成されません。

フォークされたプロセスは、出口 コマンド。元のプロセスと同じです。フォークされたプロセスはログファイルに書き込むことができます。ほとんどのプロセスでデバッグやロギングを無効にしないと、結果が混乱する可能性があります。

いくつかのptyの実装は、一瞬でも複数の読者や作家によって混乱するかもしれません。したがって、フォーク 産卵プロセスの前に。

interact string1 body1 … stringn bodyn

現在のプロセスをユーザーに制御し、キーストロークが現在のプロセスに送信され、現在のプロセスのstdoutとstderrが返されます。

文字列と本体のペアを引数として指定できます。この場合、対応する文字列が入力されたときに本体が実行されます。 (デフォルトでは、文字列は現在のプロセスに送信されません)。通訳 最終的なボディがない場合、コマンドが仮定されます。

引数全体が相互作用する 文が複数の行を必要とする場合、各行をバックスラッシュで終了させないように、すべての引数を1つに "補強"することができます。この1つのケースでは、中括弧にもかかわらず通常のTcl置換が行われます。

たとえば、以下のコマンド実行は、定義された以下の文字列 - ボディペアと対話します。^ Zが押されると、期待 停止されます。 (-reset フラグは端末モードを復元します)。^ Aが押されると、ユーザーは「あなたがコントロールAを入力しました」と表示され、プロセスは^ Aに送信されます。 $を押すと、ユーザーに日付が表示されます。 ^ Cを押すと、期待 終了します。 「foo」が入力された場合、ユーザは「bar」を見る。 ~~を押すと、期待 インタプリタはインタラクティブに動作します。

CTRLZ 032を設定します。{-reset $ CTRLZ {exec kill -STOP pid} 001 {send_user "あなたが入力したコントロール-A n"; " 001"} $ {send_user "日付は時計の形式クロック秒です。"} 003 exit foo {send_user "bar"} ~~}

文字列と本体のペアでは、文字列は引数としてリストされた順にマッチします。部分的に一致する文字列は、残りの部分が来ることを予期して現在のプロセスに送られません。文字が一致する可能性がなくなるように文字が入力された場合、文字列の一部のみが別の一致を開始できないプロセスに送信されます。したがって、最終的に一致しようとしていた元の文字列が失敗した場合、部分一致の部分文字列である文字列が後で一致する可能性があります。

デフォルトでは、文字列の一致はワイルドカードなしのものです。 (対照的に、期待する コマンドはデフォルトでグロブスタイルのパターンを使用します)。-ex フラグは、そうでなければマッチする可能性のあるパターンを保護するために使用される相互作用する そうすることからの旗。 " - "で始まるパターンは、このように保護する必要があります。 ( " - "で始まるすべての文字列は将来のオプション用に予約されています)。

-re フラグは、文字列を正規表現形式のパターンとして解釈させます。この場合、一致する部分文字列は変数に格納されます interact_out 方法と同様に期待する その出力を変数に格納するexpect_out 。ザ-indices フラグも同様にサポートされています。

パターンeof ファイルの終わりに実行されるアクションを導入します。別eof パターンはまた、-出力 この場合、出力の書き込み中にeofが検出された場合は一致します。デフォルトeof アクションは「リターン」なので、相互作用する 単にEOFを返すだけです。

パターンタイムアウト 与えられた時間に文字が読み込まれなかった後に実行されるタイムアウト(秒)とアクションを導入します。ザタイムアウト パターンは、最後に指定されたプロセスに適用されます。デフォルトのタイムアウトはありません。特別な変数 "timeout"(期待する コマンド)はこのタイムアウトに影響しません。

たとえば、次の文を使用して、何も入力していないが、システムメッセージを頻繁に取得しているユーザーを自動ログアウトすることができます。

interact -input $ user_spawn_idタイムアウト3600 return -output $ spawn_id

パターンがキーワードの場合ヌル 、nullは許可されます(remove_nulls コマンド)、1つのASCII 0がマッチすると、対応する本体が実行されます。 globまたはregexpパターンで0バイトを照合することはできません。

パターンにフラグを付ける-私は書きます 変数を引き起こす interact_out(spawn_id) パターン(またはeof)に一致するspawn_idに設定されます。

次のようなアクションブレーク そして持続する 制御構造(すなわち、にとって , proc )通常のやり方で行動する。しかしながらリターン 対話を呼び出し元に戻すinter_return 原因相互作用する 呼び出し元に戻ります。たとえば、 "proc foo"が呼び出された場合相互作用する それはその後アクションを実行しましたinter_return , proc foo 戻るだろう。 (これは、if相互作用する コール通訳 インタラクティブなタイピングリターン インタラクションを継続させますinter_return 対話が呼び出し側に戻るようにします)。

相互作用する すべての文字が現在のプロセスに渡されるように、rawモードが使用されます。現在のプロセスがジョブ制御信号を捕捉しない場合は、停止信号(デフォルトでは^ Z)が送信されると停止します。それを再起動するには、continueシグナルを送信します( "kill-CONT"など)。あなたが本当にそのようなプロセス(^ Zによる)にSIGSTOPを送る場合は、まずcshを生成してからプログラムを実行することを検討してください。一方、SIGSTOPをに送る場合は、期待 (おそらくエスケープ文字を使用して)インタープリターを呼び出し、^ Zを押します。

文字列と本体のペアは、インタプリタを入力して対話的にコマンドを実行する必要を回避するための略語として使用できます。以前の端末モードは、文字列 - 本体対の本体が実行されている間に使用されます。

速度に関しては、アクションはデフォルトでrawモードで実行されます。ザ-reset フラグは端末を以前のモードにリセットする相互作用する 実行された(常に、調理モード)。モードの切り替え時に入力される文字は失われる可能性があることに注意してください(一部のシステムではターミナル・ドライバーの残念な機能です)。使用する唯一の理由-reset あなたの行動が調理モードで実行されているかどうかです。

-エコー flagは、次のパターンに一致する文字を、各文字の読み込み時に生成されたプロセスに返します。これは、ユーザーが部分的に入力されたパターンからのフィードバックを参照する必要がある場合に便利です。

パターンがエコーされているが最終的に一致しない場合、文字は生成されたプロセスに送信されます。生成されたプロセスがそれらをエコーすると、ユーザーはその文字を2回見ます。-エコー おそらくユーザーがパターンを完成させそうにない状況でのみ適切です。たとえば、次の抜粋は、現在のディレクトリを再帰的に取得、入力、または一覧表示するために〜g、〜pまたは〜lを入力するようユーザーにプロンプ​​トが出されるrftpの再帰的-ftpスクリプトからの抜粋です。これらは通常のftpコマンドとはかなり離れているため、間違いを除いて〜と入力することはまずありません。その場合は、とにかく結果を無視することになります。

対話{-echo〜g {getcurdirectory 1} -echo〜l {getcurdirectory 0} -echo〜p {putcurdirectory}}

- バッファー flagは、次のパターンと一致する文字を、文字が読み込まれるときに出力プロセスに送信します。

これは、プログラムがパターンをエコーバックさせたい場合に便利です。たとえば、次のようにして、人がどこにダイヤルしているかを監視することができます(Hayesスタイルのモデム)。 "atd"が表示されるたびに、スクリプトは残りの行を記録します。

proc lognumber {} {対話型--nobuffer -re "(。*) r"戻り値$ log "時計式クロック秒:ダイヤル$ interact_out(1、string)"}対話型 - バッファー "atd" lognumber

相互作用する 、以前の使用log_user 無視されます。特に、相互作用する ユーザが盲目的に対話したくないと推定されるので、その出力を強制的に記録する(標準出力に送る)。

-o フラグは、現在のプロセスの出力に適用される、後続のキーとボディのペアを生成します。これは、たとえば、telnetセッション中に不要な文字を送信するホストを扱う場合に便利です。

デフォルトでは、相互作用する ユーザーがstdinを書き、stdoutを読み込むことを期待しています期待 プロセス自体。ザ-u フラグ( "user"の場合)は相互作用する ユーザーをその引数で指定されたプロセス(スポーンされたIDでなければならない)として探します。

これにより、明示的なループを使用せずに、関係のない2つのプロセスを結合することができます。デバッグを助けるために、Expect診断は常にstderr(または特定のロギングとデバッグ情報についてはstdout)に行きます。同じ理由で、通訳 コマンドはstdinから対話的に読み込みます。

たとえば、次のフラグメントはログインプロセスを作成します。次に、ユーザ(図示せず)にダイヤルし、最後に2つを一緒に接続する。もちろん、ログインの代わりに任意のプロセスを使用することもできます。たとえば、シェルを使用すると、アカウントとパスワードを入力せずに作業することができます。

spawn login set login $ spawn_id spawn tip modem#ユーザにダイヤルアウトする#ユーザをloginに接続するinteract -u $ login

出力を複数のプロセスに送るには、それぞれのspawn idリストの先頭にa-出力 フラグ。出力スポーンIDのグループの入力は、aで始まるスポーンIDリストによって決定される。-入力 フラグ。 (両方-入力 そして-出力 あなたと同じ形でリストを取るかもしれない-私期待する コマンド。ただし、any_spawn_idは意味がありません。相互作用する )次のすべてのフラグと文字列(またはパターン)は、別の-inputフラグが現れるまでこの入力に適用されます。ない場合-入力 表示され、-出力 "-put $ user_spawn_id -output"を意味します。 (同様に、-入力 。)ある場合-入力 $ user_spawn_idを上書きします。 1秒-入力 $ spawn_idをオーバーライドします。追加-入力 フラグを指定することができます。

2つの暗黙の入力プロセスのデフォルトは、出力が$ spawn_idと$ user_spawn_id(逆)に指定されています。もし-入力 フラグはnoで表示されます-出力 フラグ、そのプロセスからの文字は破棄されます。

-私 フラグは、現在のspawn_idの置換を導入します。-入力 または-出力 フラグが使用されます。 A -iフラグは-oフラグを意味します。

間接的なスポーンIDを使用して相互作用しているプロセスを変更することは可能です。 (間接的なスポーンidについては、expectコマンドのセクションで説明しています)。間接的なspawn idは、-i、-u、-input、または-outputフラグで指定できます。

インタープリタargs

ユーザーに対話的にプロンプ​​トが表示されます期待 およびTclコマンド。各コマンドの結果が表示されます。

次のようなアクションブレーク そして持続する 制御構造(すなわち、にとって , proc )通常のやり方で行動する。しかしながらリターン 通訳者は呼び出し元に戻りますが、inter_return 原因通訳 呼び出し元に戻ります。たとえば、 "proc foo"が呼び出された場合通訳 それはその後アクションを実行しましたinter_return , proc foo 戻るだろう。その他のコマンドの原因通訳 新しいコマンドの入力を続ける。

デフォルトでは、プロンプトには2つの整数が含まれています。第1の整数は、評価スタックの深さ(すなわち、Tcl_Evalが何回呼び出されたか)を記述する。 2番目の整数はTcl履歴識別子です。プロンプトは、 "prompt1"というプロシージャを定義し、戻り値が次のプロンプトになるように設定することができます。文に開かれた引用符、括弧、中括弧、または角括弧がある場合、改行時に二次プロンプト(デフォルトでは "+>")が発行されます。セカンダリプロンプトは、 "prompt2"というプロシージャを定義することで設定できます。

通訳 その呼び出し元がrawモードを使用していたとしてもcookedモードが使用されます。

stdinが閉じている場合、通訳 あなたが-eof フラグが使用されます。この場合、後続の引数が呼び出されます。

log_file args -a file

ファイル名が指定されている場合は、log_file そのファイルの中に(その時点で始まる)セッションの写しを記録します。log_file 引数が指定されていない場合、記録を停止します。以前のログファイルは閉じられています。

ファイル名の代わりに、Tclファイル識別子は、-開いた または-leaveopen フラグ。これは、スポーン コマンド。 (見るスポーン 詳細はこちらをご覧ください)。

-a フラグは、出力がログに記録されるように強制します。log_user コマンド。

デフォルトでは、log_file コマンド 追加する 古いファイルを切り捨てるのではなく、1つのセッションで複数回ログオフしたりできるようになりました。ファイルを切り詰めるには、-noappend フラグ。

-info flagは、log_fileに与えられた最新の非情報引数の記述を返します。

log_user -info | 0 | 1

デフォルトでは、send / expectダイアログはstdout(および開いている場合はログファイル)に記録されます。 stdoutへのロギングは、コマンド "log_user 0"によって無効にされ、 "log_user 1"によって再び有効にされます。ログファイルへのロギングは変更されません。

-info フラグを指定すると、log_userは指定された最新の非情報引数の説明を返します。

match_max -d -i spawn_id size

内部で使用されるバッファのサイズ(バイト単位)を定義します。期待する 。なしで サイズ 現在のサイズが返されます。

とともに-d フラグを指定すると、デフォルトサイズが設定されます。 (初期のデフォルトは2000です。)-私 フラグは、指定されたスポーンidに対してサイズが設定されます。それ以外の場合は、現在のプロセスに設定されます。

オーバーレイ - #spawn_id - #spawn_id …プログラムargs

実行する "プログラム 現在の場所の代わりに "args"期待 プログラムを終了します。裸のハイフン引数は、ログインシェルであるかのように、コマンド名の前にハイフンを強制します。すべてのspawn_idは、引数として指定されたものを除いて閉じられます。これらは、指定されたファイル識別子にマップされます。

Spawn_idは、新しいプログラムが継承するファイル識別子にマップされます。たとえば、次の行はチェスを実行し、現在のプロセス(チェスマスターなど)によって制御されます。

オーバーレイ-0 $ spawn_id -1 $ spawn_id -2 $ spawn_idチェス

これは "interact -u"よりも効率的ですが、プログラムされた対話を行う能力を犠牲にします。期待 プロセスはもはや制御できません。

制御端末は設けられていないことに留意されたい。したがって、標準入力を切断または再マップすると、ジョブ制御(シェル、ログインなど)を行うプログラムは正しく機能しません。

パリティ-d -i spawn_id 値

パリティが生成されたプロセスの出力から保持されるか、または取り除かれるべきかを定義します。もし 値 パリティは取り除かれ、そうでない場合は取り除かれません。なしで 値 現在の値が返されます。

とともに-d デフォルトのパリティ値が設定されます。 (初期値は1です(パリティは削除されません)。-私 フラグは、指定されたspawn idに対してパリティ値が設定されます。それ以外の場合は、現在のプロセスに設定されます。

remove_nulls -d -i spawn_id value

パターンマッチングまたは変数への格納の前に、生成されたプロセスの出力からヌルが保持されるか削除されるかを定義します expect_out または interact_out 。もし 値 1の場合、nullは削除されます。もし 値 0の場合、nullは削除されません。なしで 値 現在の値が返されます。

とともに-d フラグを指定すると、デフォルト値が設定されます。 (初期設定は1です。つまり、nullが削除されます)。-私 フラグの場合、指定されたspawn idに値が設定されます。それ以外の場合は、現在のプロセスに設定されます。

nullが削除されるかどうか、期待 ログとstdoutにヌルバイトを記録します。

send -flags string

センド 文字列 現在のプロセスにたとえば、コマンド

"hello world r"を送る

現在のプロセスに文字を送信します。 (Tclにはprintfのようなコマンドが含まれていますフォーマット )任意の複雑な文字列を構築することができます。)

文字は直ちに送信されますが、ラインバッファリングされた入力を持つプログラムは戻り文字が送信されるまで文字を読み込みません。戻り文字は " r"と表示されます。

-- flagは、次の引数がフラグではなく文字列として解釈されるようにします。実際にフラグのように見えるかどうかにかかわらず、任意の文字列の前に " - "を付けることができます。これは、誤ってフラグのように見えるものによってトリップされることなく、変数文字列を指定する信頼できるメカニズムを提供します。 ( " - "で始まるすべての文字列は将来のオプション用に予約されています)。

-私 フラグは、文字列が指定されたspawn_idに送信されることを宣言します。 spawn_idが user_spawn_id 端末がrawモードになっている場合、文字列の改行は、端末がcookedモードであるかのように見えるように、改行文字列に変換されます。ザ-生 flagはこの変換を無効にします。

-ヌル フラグはヌル文字(0バイト)を送信します。デフォルトでは、1つのヌルが送信されます。整数が-ヌル 送信するヌル数を指定します。

-ブレーク フラグはブレーク条件を生成します。これは、spawn idが "spawn -open"で開かれたttyデバイスを参照する場合にのみ意味があります。ヒントなどのプロセスを生成した場合は、ヒントを生成するためのヒントの規約を使用する必要があります。

-s フラグは、出力が「ゆっくり」送信されるようにするので、コンピュータが同じバッファをアウトタイプしない人間のために設計された入力バッファをアウトタイプ化する一般的な状況を回避する。この出力は、2つの要素リストを取る変数 "send_slow"の値によって制御されます。最初の要素は、原子的に送信するバイト数を表す整数です。 2番目の要素は、アトミックセンドを分離