この記事は公開されてから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.
まとめ
簡単に対話型シェルアプリケーションが作成できました。 履歴やヘルプ機能も提供してくれますし、いろいろな用途がありそうです。
参考サイトなど
- node-shell: http://www.adaltas.com/projects/node-shell/
- Github: https://github.com/wdavidw/node-shell