Linuxでは、多くのプログラムにCLIバージョンとGUIフロントエンドがあります。私はこれがLinuxの哲学に従い、良い習慣であることをどこかで読みました。もちろん、開発者の観点からは、GUIコードと実際のプログラムを分離するのが正しい。
コマンドラインで使いやすいプログラムがある場合は、コマンドラインバージョン用のGUIを作成したいと思います。ここで私のオプションは何ですか?
GUI開発者が使用するのは2つしか考えられません。
次のように構成されたパラメーターを使用してプログラムを呼び出します。
システム(「プログラム - パラメータ1 -p2 -p3」)
ソケット(unix、inet ...)を使用してCLIバージョンをサーバーモードで実行し、これらのソケットを使用して「サーバー」と通信できます。
私の考えでは、最もクリーンなソリューションは2番目のソリューションですが、CLIのバージョンを変更せずに常に可能なわけではありません。
実際の質問は、cliバージョンとGUIバージョンを別々に構築する正しい方法は何ですか?
答え1
もう一つのアプローチは、機能をライブラリとして書くことです。その後、ライブラリを使用するGUIとライブラリも使用するCLIがあります。タスクの複雑さに応じて、両方のプログラムがプロセス間通信なしで独立して動作できるため、これが最善の解決策になる可能性があります。
答え2
プログラムの実行が比較的遅い場合無国籍、インタラクティブでない場合、または通常完了するまで実行される場合は、最初のオプションが最も簡単で最も適切です。
プログラムが次の場合状態を保存、実行時間が長い場合は複雑になりますが、2番目のオプションが最適です。
FTPについて考えてみてください。ダウンロードを使用curl
またはスクリプトすることと対話型FTPセッションをスクリプト化することは、それぞれの場合に正解ではない可能性があります。wget
expect
興味深い研究事例は次のとおりです。
nmap
複雑で便利な出力はすべてXML形式で提供でき、スキャン中にフィードバックが提供されます。一度始めたら、座って待ってください。gpg
CLI は長い間 GUI 電子メールクライアントと統合されてきたため、入出力にファイル記述子を使用します。xmlclitools
興味深いデュアルモード操作、スタンドアロンモード、クライアント/サーバーモード機能
答え3
GUIでどの言語を使用する予定ですか?呼び出しに基づいてC / C ++を推測しますsystem()
。 Pythonを使用することもできます。os.exec*()またはOS.システム()他の呼び出しシェルスクリプトを含む他の多くの言語の関数または同様の関数ライン、庭またはGTKダイアログボックスGUIインタラクションに使用されます。
使用C/C++ システム() 関数持つ注意事項。他のほとんどの言語コンパイラとインタプリタはC / C ++で書かれているので、それに対応する関数/メソッドでも同じ問題が発生することがよくあります。注意して使用してください。
これGTKDialog は Puppy Linux コミュニティで広く使用されています。最も一般的なGTK + GUIウィジェットをサポートしているので、bashシェルスクリプトから呼び出されます。 XMLに似たGTKDialogコードは、export
実行可能ファイルの呼び出し時に渡されるedシェルスクリプト文字列に含まれていますgtkdialog
。したがって、すべてのコードは同じファイルに保持されます。
庭フォークですライン掛けるジェニティスGTK+ GUIは非常に強力で、現在私が選んだツールです。
一般的な方法はGTKダイアログボックス、ラインそして庭はい...
- 1つ以上の呼び出しを介してインタラクティブに引数を収集するシェルスクリプトの作成GTKダイアログボックス、ラインまたは庭(または一部または全部)
- 収集されたパラメータを使用してコマンドラインプログラムを実行する
インタラクティブなGUIと機能コードまた、同じスクリプトで、必要に応じてコマンドラインオプションを使用してGUI、CLI、またはAPI(非対話型)を選択できます。より良い方法は、起動時に内部検出を実行し、適切なインターフェースを自動的に選択することです。