何かしらシェルコマンドを作ろうとすると,パイプから入力を読まなければならない事がある.必要は無くとも,ファイルを受け取る所は標準入力からも受け取れるようにしておくと後々便利なことは多いと思う(diff
,grep
とかみたいに).
シェルコマンドでは大抵の場合,echo backを止める必要があるが,ググってもQiitaでも方法が見つからなかったのでメモがてら投稿.
(Node.jsでecho backとするとecho serverが出てきてしまい標準入力の話に中々行き着かなかった.)
まとめ
- Node.jsでパイプを扱う際には
readline
モジュールを使用. - echo backをなくすには
terminal: false
を追加.
基本的なstdin
の扱い方
Node.jsでstdinを読む方法を調べると,いくつかのWebページ(これなど)が見つかる.
これらを参考にすると,readline
モジュールを使って,
test1.js
var readline = require('readline');
var reader = readline.createInterface({
input: process.stdin,
output: process.stdout
});
reader.on('line', function (line) {
console.log(line);
});
reader.on('close', function () {
console.log("---close---");
});
のように書けばプラットフォーム間の動作の差異もなく,望ましいということがわかる.
しかし,自分の環境(Arch Linux,Node.js 5.7.1)では,次のように表示されてしまった.
$ echo a | node test1.js
a
a
---close---
標準入力のecho backがなくなっていないため,a
が2つ表示されてしまっている.
echo backをさせない読み方
これを修正するためには,
test2.js
var readline = require('readline');
var reader = readline.createInterface({
input: process.stdin,
output: process.stdout,
terminal: false
});
reader.on('line', function (line) {
console.log(line);
});
reader.on('close', function () {
console.log("---close---");
});
というように,createInterface
でterminal: false
を追加する.
こうすると,
$ echo a | node test2.js
a
---close---
となり,echo backが消える.