7

ベンダーによってサポートされなくなった20年前のインタラクティブなコマンドラインUNIXアプリケーションを継承しました。このアプリケーションでは、いくつかのタスクを自動化する必要があります。

これらの中で最も厄介なのは、わずかに異なるパラメータ(たとえば、異なる識別子、異なる名前)を使用して何千もの新しいレコードを作成することです。レコードは一度に1つずつ順番に作成する必要があり、手動で作成するには数か月(したがって数ドル)かかります。ほとんどの場合、レコードの作成には、コマンドの入力、応答の読み取り、追加のコマンドの入力などの非常に予測可能なパターンがあります。ただし、一部のレコード作成操作では、次のようなエラー状態(「この識別子を持つレコードは既に存在します」)が発生します。正常に終了する別のコマンドセット。

私はこれを行うためのいくつかの異なる方法を見ることができます:

  • 名前付きパイプ。STDINとSTDOUTを名前付きパイプに設定してターゲットアプリケーションを実行するPerlスクリプトを記述し、ターゲットアプリケーションに一連のコマンドを送信して、必要なパラメーターを含むレコードを作成し、ターゲットアプリケーションに終了してシャットダウンするように指示します。次に、さまざまなパラメーターを使用して、必要な回数だけスクリプトを実行します。

  • 応用。インタラクティブプログラムのスクリプトを作成するために使用できる別のUnixツールを見つけてください。私が見つけることができたのは期待されているものだけですが、これは維持されているようには見えません。チャットは昔から思い出しており、多かれ少なかれ私が望んでいることをしているように見えますが、モデムを制御するためだけのもののようです。

もう1つの潜在的な問題:ターゲットアプリケーションはVT100端末用に作成されており、ある種のエスケープシーケンスを使用して、強調表示の提供などを行っていると思います。

私の質問は、どのようなアプローチを取るべきかということです。これらの1つ、または完全に異なる何か?名前付きパイプを使用し、FIFOを開いて必要に応じて読み取りと書き込みを行うPerlスクリプトを使用するというアイデアは非常に気に入っています。柔軟性が高いためですが、私が読んだところによると、私はこの道を進みます。

前もって感謝します。

4

3 に答える 3

12

混沌が示唆しているように、私は間違いなくPerlに固執して柔軟性を高めます。あなたはExpectperlモジュールを知っていますか?名前付きパイプアプローチよりもはるかに優れています。

名前付きパイプの場合も、レガシーアプリケーションから返される出力を強制的にバッファリング解除することはできません。これは煩わしい場合があります。Expect.pmはこの問題を回避するためにpseudo-ttysを使用していると思いますが、よくわかりません。詳細については、「別のプロセスとの双方向通信」perlipcのセクションの説明を参照してください。

于 2009-09-24T12:15:38.880 に答える
4

expectおそらくあなたが信用しているよりもはるかに堅実ですが、私があなただったら、プロセスを管理するための完全で使い慣れたプログラミング言語が必要であり、奇妙な問題が何であれ自信を持って、Perl オプションを使用します。それらに対処する方法があります。

于 2009-09-24T11:19:50.943 に答える
4

Tcl またはPerl 実装のいずれかを使用することが、私の最初の試みになると予想されます。出力に奇数のシーケンスが表示される場合は、奇数の端末処理を行っているため、マッチングを行う前にそれらを出力からフィルタリングするだけです。

名前付きパイプを使用すると、Expect を再発明することになります。

于 2009-09-24T16:38:43.887 に答える