2012-10-31 14 views
9

私は現在、LinuxのC++アプリケーションを設計中です。その後、一度、理想的に、私はその実行を制御するためのコマンドを発行できるようにする必要があり、次のようなものを実行し、コマンドラインから実行されます。C++コマンドラインインターフェイス

$ sudo ./myapplication 
APP > 
APP > 
APP > //just pressing return 
APP > openlog test1.txt //APP will now call the openlog function 
APP > 

私は、これは比較的簡単な作業です想像するが、私は持っていますそのようなインタフェースが何を検索するために呼び出されるかは知られていません。誰でもこの機能を実行できるライブラリやサンプルを知っていますか?それとも、私は自分でCoutとCinを使って書く必要がありますか?もしそうなら、望ましいアプローチはありますか?

+1

C++には反射がありません。あなたはそれを回避する必要があります。 – chris

+0

これを行う方法がわからない場合は、スーパーユーザーが実行するアプリケーションを作成するべきではありません.... – Barmar

+3

@Barmarこのアプリケーションはsuによって実行される必要があると言う双曲線です。知覚レベルの知覚のためにスーパーユーザーによって実行されるアプリケーションを作成すべきではありません。 –

答えて

13

これにはGNU readlineライブラリをお勧めします。入力行を得る面倒な作業を行い、バックスペース、左右の矢印などで行を編集したり、上矢印を使用して古いコマンドを呼び出したり、^ Rを使用して古いコマンドを検索したりすることもできます。 Readlineには、Linuxのような典型的なUNIX系のディストリビューションがインストールされていますが、持っていなければ、hereです。

編集:ここでは最小限のreadlineの例は次のとおりです。

#include <stdio.h> 
#include <readline/readline.h> 
#include <readline/history.h> 

int main(int argc, char ** argv) 
{ 
    while(1) 
    { 
     char * line = readline("> "); 
     if(!line) break; 
     if(*line) add_history(line); 
     /* Do something with the line here */ 
     free(line); 
    } 
} 
-4

アプリケーションをTCLまたはPythonアプリケーションとして記述し、フロントエンドとして使用できます。

1

自分自身を少なくとも部分的にロールバックする必要があります。 GNUのreadlineは少し助けてくれるかもしれません。これを達成し、実際にコードを追加できる「スケルトン」である短いプログラムについては、http://en.wikipedia.org/wiki/GNU_readlineをチェックしてください。

1

おそらくthe readline libraryをご覧ください。学習曲線は少しありますが、完全なCLIを自分で再作成するよりもはるかに簡単です。あなたのプロジェクトには適していないかもしれないので、ライセンスをチェックしてください。

5

GNU readlineライブラリを使用すると、フルラインの編集や履歴機能をしたい場合は素晴らしいですが、シンプルなプロンプトで十分では(またはあなたがしたくない場合は場合GNUライセンス)、その後、あなただけの標準ライブラリでこれを行うことができます。

#include <iostream> 
#include <string> 

void process(std::string const & line); 

int main() 
{ 
    for (std::string line; std::cout << "APP > " && std::getline(std::cin, line);) 
    { 
     if (!line.empty()) { process(line); } 
    } 

    std::cout << "Goodbye.\n"; 
} 
2

私は、これは反射ではない言語で難しくなることをクリスさんのコメントに同意します。 C++では、入力したものを特定の関数に明示的にマップする必要があります。

あなたがあなた自身をロールバックするつもりなら、あなたの一般的な設計は、次のようなものになります。

  • を読む入力ライン(最も可能性の高い文字列にcin.getlineを使用して)
  • は、最初の単語を特定します
  • 関数にマップされていない場合は、エラーをポストしてプロンプトを再表示します。
  • マップする場合は、その行の他の単語を調べる必要があります。
  • 単語ごとに、文字列を単語ごとに関数パラメータとして必要なデータ型に変換する必要があります(ここでは、文字列ストリームが便利です)。
  • ここでは、指定したパラメータが、呼び出された関数に対して正当なものであることを確認する必要があります。関数を呼び出す前に事前チェックするか、関数内のエラーをチェックすることができます。
  • 関数名を確認して、パラメータが正しい(そして正しい番号の)ものであれば、その関数を呼び出すことができます。

反射言語では、文字列を直接関数名に変換できるため、前半は大幅に簡略化されています。

+1

'std :: istream :: getline'より' std :: getline'を強くお勧めします。 – chris

2

GNU readlineは、他の人が示唆しているように、優れた選択肢です。ライセンスの懸念があなたにそれを排除するように強制するなら、linenoiseを考慮する必要があります。

少し遅れ
+0

linenoiseは完成機能も備えているようですが、これは素晴らしいことかもしれません。 – etham

1

はGPLライセンスの点に注意してください。 GNU Readlineの 答えで、人々はGNU readlineのGPLライセンスについて言及しています。この回答では、新しいユーザーや開発者が見過ごすかもしれないGPLライセンスの意味を強調したいと思います。 https://en.wikipedia.org/wiki/GNU_Readline

GNU Readlineの免許証としてGPLの選択[編集] GNU Readlineのは 代わり GNU General Public License(GPL)の下でライセンスされたフリーソフトウェアライブラリであるために注目すべきであるからコピー

テキストGNU一般一般 パブリックライセンス(LGPL)。フリーソフトウェアライブラリは、LGPLの下で (GNU Cライブラリ、GNU gettext、FLTKなど)のライセンスを得られることがよくあります。新しいアプリケーションを構築することが 組み合わせたアプリケーションを配布する際にLGPLの下に残っている使用していますLGPL ライセンスのライブラリを持つ必要がある場合に

LGPLにリンクすることを選択したアプリケーションの開発者は、 ライブラリのライセンスを取得しました。 LGPLライセンスライブラリを除いた アプリケーションを組み合わせた部分は、 オリジナルライセンスの下に置くことができます。[1]これは のセクション5に準拠する、分散する際全体組み合わされたアプリケーションは、GPLの下で のライセンスを取得することが要求される場合 で新しいアプリケーションを作成する 使用GPLライセンスのライブラリを選択する開発者とは対照的ですGPL [2] [3] GNU ReadlineののGPLライセンスの

影響[編集]重要な例GNU Readlineのコピーレフトの 条件を遵守するためのライセンスを変更するアプリケーションの は、Common Lispの実装のCLISPです。 元々は1987年にリリースされ、CLISPの元の著者、Bruno HaibleとRichard Stallmanの間のメール交換の後、1992年にGPLライセンスに変更された[4] 、Stallmanは[CLISPのreadlineは、Readlineを使ったCLISPの の実装を配布したい場合、HaibleはGPLの下で のCLISPを再ライセンスする必要があることを意味していました[6] permissively ライセンスされてい

代替コマンド行編集ライブラリは コマンドライン編集機能を実装するソフトウェアプロジェクトで使用されるが、 寛容なライセンスの下に残ることを望むことができます。これらの中には、BSDライセンスのlibeditがあります。 MariaDB [7]やPHP [8]のようないくつかのアプリケーションでは、GNU Readlineとリンクするか、 libeditをリンクするかをユーザが で選択できます。他のコマンドライン編集ライブラリは、 という2つの目的に使用されます。これらのライブラリは、いくつかのメインプロジェクトのAPIと揃っており、 互換ライセンス条項を持っています。これの例は、Haskell互換のAPIをGlasgow Haskell コンパイラ[9]と、ライン編集 サービスを必要とする他のHaskellプロジェクト[10]に公開するHaskelineライブラリ、 です。

このようなライブラリへのリンクは、外部リンクに一覧表示されています。

関連する問題