node.jsのいろいろなモジュール20 – node-shellで対話型アプリケーションを作成

2013.03.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

対話型シェルアプリをつくろう

ユーザーからの入力を待って、入力されたコマンドを元に結果を返すプログラムを、対話型のプログラムといいます。
node自体もコマンドラインで「node」と入力すれば、対話型のシェル(REPL)が起動しますね。
今回は、nodeで簡単に対話型シェルアプリケーションを作成するモジュール、「node-shell」を紹介します。

環境構築方法

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.4
  • Node.js : v0.8.15
  • npm : 1.1.66

適当なディレクトリを作成し、そこでnpmを使用してnode-shellをインストールします。

% mkdir shell
% cd shell
% npm install shell
% touch app.js

対話型シェルアプリケーションをつくってみる

ではnode-shellモジュールを使用して、簡単な対話型シェルをつくってみましょう。
今回は、配列型変数を操作する対話型シェルをつくります。
まずはプログラム全文です。

var shell = require('shell');
var app = new shell( { chdir: __dirname } )

//データ保存用変数
var stack = [];

//シェルの環境設定
app.configure(function() {
    app.use(shell.history({
        shell: app
    }));
    app.use(shell.completer({
        shell: app
    }));
    app.use(shell.router({
        shell: app
    }));
    app.use(shell.help({
        shell: app,
        introduction: true
    }));
});

//コマンド定義
app.cmd('push :value', 'add stack data', function(req, res, next){
    stack.push(req.params.value);
    console.log("push:" + req.params.value);
    res.prompt();
});

app.cmd('pop', 'pop stack data', function(req, res, next){
    var data = stack.pop();
    console.log("pop:" + data );
    res.prompt();
});

app.cmd('list', 'list stack data', function(req, res, next){
    console.log("show stack list.");
    for(var i = 0; i < stack.length; i++) {
         console.log(stack[i]);
    }
    res.prompt();
});
[/javascript]
</p>

<p>
では順番に解説します。</br>
shellモジュールをrequireした後、引数のchdir(カレントディレクトリ)を指定してインスタンス化しています。</br>
このapp変数に対して操作をすることで、対話型シェル全体の設定を変更することができます。</br>

var shell = require('shell');
var app = new shell( { chdir: __dirname } )

次に、シェル全体の設定です。ヘルプ機能、履歴機能、補完機能を有効化しています。
詳細な説明はこのあたりをみてください。

//シェルの環境設定
app.configure(function() {
    app.use(shell.history({
        shell: app
    }));
    app.use(shell.completer({
        shell: app
    }));
    app.use(shell.router({
        shell: app
    }));
    app.use(shell.help({
        shell: app,
        introduction: true
    }));
});

そして、シェルで使用するコマンドを登録します。
stack変数はシェルで操作する配列です。app.cmd関数を使用し、データを登録する「push」、
データを取り出す「pop」、stackの内容を表示する「list」コマンドを定義しています。

//データ保存用変数 var stack = [];

//コマンド定義 app.cmd('push :value', 'add stack data', function(req, res, next){ stack.push(req.params.value); console.log("push:" + req.params.value); res.prompt(); });

app.cmd('pop', 'pop stack data', function(req, res, next){ var data = stack.pop(); console.log("pop:" + data ); res.prompt(); });

app.cmd('list', 'list stack data', function(req, res, next){ console.log("show stack list."); for(var i = 0; i < stack.length; i++) { console.log(stack[i]); } res.prompt(); }); [/javascript]

プログラムの記述ができたら、起動して対話型シェルを動かしてみましょう。

% node app.js
Type "help" or press enter for a list of commands
>> help
Available commands:
quit                Exit this shell
help                Show this message
push :value         add stack data
pop                 pop stack data
list                list stack data

ヘルプを表示する「help」と、シェルを終了する「quit」はデフォルトで用意されています。
helpコマンドを入力すると、登録されているコマンド一覧が表示されていますね。

各コマンドを使ってみてください。データの登録、削除、表示ができます。
また、タブキーを押せば、補完もききます。

>> push hello
push:hello
>> list
show stack list.
hello
>> pop
pop:hello
>> list
show stack list.

まとめ

簡単に対話型シェルアプリケーションが作成できました。
履歴やヘルプ機能も提供してくれますし、いろいろな用途がありそうです。

参考サイトなど