2012-04-27 5 views
1

良い一日のようにヒストリ機能、Cコマンドラインインターフェイス - BASH

私は、ユーザからの文字列を受け入れることができ、単純なプロンプトを提供する単純なCLI(コマンドラインインターフェイス)アプリケーションを書いていますが、それらを検証し、入力に基づいて特定のアクションを実行します。かなり簡単。

私は、プラットフォームに依存しない、NON-GPL/LGPLの手段を探しています(または、少なくともLinux、BSDなどのPOSIX準拠のOSで動作するもの)を意味します。 CLIアプリケーションで以前に入力したコマンドの履歴を前後にスクロールし、入力行に表示させます。

目的は、BASHと他のほとんどのシェルに見られる履歴機能を効果的に模倣することです。私はちょうどアップ/ダウンキーを使用して、それらを検出させたいと思います。私は、これに割り込みや特殊ライブラリを使用する必要があると仮定しています。私は本当に標準のANSI Cでこれを行うだけで、サードパーティのライブラリを完全に避けなければなりません。

+1

おそらくncursesは、プラットフォームに依存しない方法で、ほとんどの作業をあなたのために行います。 –

答えて

7

あなた自身で行うことを強くお勧めする場合は、「自分でやってください」以外のことはあまりありません。それはひどく複雑ではありませんが、それは朝の仕事でもありません。

あなたは非常に真剣にGNU readlineの使用を検討する必要があります。他の人(bashを含む)が使用するものです。それはこれ以上すべてを行い、うまくいく。

+1

Ps。間違ったURLを試してみてください。http://www.gnu.org/s/readline/ – Morpfh

+0

@Rune - ありがとう!編集されました。 –

4

bashが使用するライブラリreadlineを使用できます。これはGPLなので、あなたのコードは内部またはGPLでなければならないでしょう。 BSDライセンスのあるlibeditには、機能が少ないものがあります。

1

他の回答に記載されているように、本当はreadlineを使うべきです。それ以外の場合は、バッファを使用し、stdinファイル記述子をread()で使用する必要があります。あなたは、あなたの履歴を含むデータ構造やファイルをセットアップする必要があります。また、execvp()および/またはsystem()を使用してコマンドをディスパッチすることもできます。

4

あなたはreadlineを使うことができます。あるいは、簡単なルートをとって、何もしなくてもかまいません。あなたがあなたのプログラムを実行するとき、rlwrap経由でそれを呼び出すと、無料で履歴編集ができます。言い換えれば、代わりの場合:

$ mytool 

あなただけ

$ rlwrap mytool 

を実行rlwrapは、あなたがどんな仕事をしなくてのreadlineのメリットを得ることができますreadlineのラッパーです。

+0

+1「rlwrap」について私は知らなかった。私は同じアイデアのJavaバージョンを使用しました。 Windowsでは、コンソールプログラムはデフォルトでreadlineのような動作をすることに注意してください! –

関連する問題