22

私は TCL (expect) スクリプトの書き方を学んでいますが、一部の例では spawn の使用が示されているのに気づきましたが、他の例ではコマンド exec が示されています。ググってみましたが、違いがわかりませんか?

長い期待スクリプトの途中で「exec」を呼び出すとしたら、何が起こると予想できますか?

4

4 に答える 4

18

spawnコマンドではexpectなくtclコマンドです。コマンドですexectcl

spawnプロセスを作成します。プロセスの入力と出力は、その他の expect コマンド ( sendexpectおよび) で使用できるように Expect に接続されますinteract

exectcl の下にサブプロセスを作成します。一般に、サブプロセスが完了するまで tcl は中断されます。ただし、バックグラウンドでサブプロセスを作成することができ(& を最後の引数として使用)、入力と出力を正しく接続すると、tcl はサブプロセスと対話できます。これは非常にぎこちなく、スムーズに処理するように設計されたものとまったく同じ種類の対話です。

于 2009-02-16T19:50:52.143 に答える
17

質問に答える簡単な方法は、いつ exec と spawn を使用する必要があるかを尋ねるように言い換えることです。つまり、対話型コマンドには spawn を使用し、非対話型コマンドには exec を使用します。

于 2009-03-01T05:58:17.967 に答える
5

一部の(多くの?)プログラムは、ユーザーが(つまり、コマンドラインで)実行した場合と、バッチプロセスの一部である場合/別のプロセスから実行した場合とでは動作が異なることにも注意してください。実際の違いは、プロセスに端末が接続されているかどうかです。

TclのExpect拡張機能の一部であるspawnコマンドは、実行されたプログラムがそれ自体をユーザーによって実行されていると見なすように設定し、tclプログラムが便利な方法で外部プログラムと対話できるようにする機能を追加します(つまり、マッチング正規表現を介して出力され、それらの一致から分岐します)。スポーンを介して実行されるものは非同期で実行されます。

execコマンドは、他のプログラムを実行してその出力を返すコアTclコマンドです。spawnのような複雑なセットアップは行いませんが、プログラムを実行してその出力(および戻りコード)を確認するのに非常に便利です。execによって実行されるものは、デフォルトでは同期的に実行されますが、コマンドの最後にアンパサンドがあると、バックグラウンドで実行されます(従来のシェルスクリプトのように)。

openコマンドは、通常、ファイルの読み取り/書き込みに使用されますが、外部プロセスの実行にも使用できます。コマンド名の前にパイプ(|)記号を付けることにより、外部プロセスを実行し、結果のプロセスと対話するための読み取り/書き込みファイル記述子へのアクセスを取得するようにコマンド名に指示します。これは、execとspawnの中間のようなものであり、利用可能なプロセスとの相互作用がはるかに多くなりますが、spawnのような複雑な環境設定はありません。これは、入力を必要とするプログラムとの対話に非常に便利ですが、それでも自動化のためにかなりうまくセットアップされています。

于 2009-04-13T14:33:09.633 に答える
0

私の知る限り、spawn はプロセス ID を返します (そして、Expect とリンクします)。一方、exec は、「&」を渡さない限り、最終的な stdout を返すだけです。したがって、それはあなたの期待に影響を与えません。

于 2009-02-16T19:40:03.730 に答える