Qiitaからの移動


何かしらシェルコマンドを作ろうとすると,パイプから入力を読まなければならない事がある.必要は無くとも,ファイルを受け取る所は標準入力からも受け取れるようにしておくと後々便利なことは多いと思う(diffgrepとかみたいに).

シェルコマンドでは大抵の場合,echo backを止める必要があるが,ググってもQiitaでも方法が見つからなかったのでメモがてら投稿. (Node.jsでecho backとするとecho serverが出てきてしまい標準入力の話に中々行き着かなかった.)

まとめ

  • Node.jsでパイプを扱う際にはreadlineモジュールを使用.
  • echo backをなくすにはterminal: falseを追加.

基本的なstdinの扱い方

Node.jsでstdinを読む方法を調べると,いくつかのWebページ(これなど)が見つかる. これらを参考にすると,readlineモジュールを使って,

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をさせない読み方

これを修正するためには,

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---");
});

というように,createInterfaceterminal: falseを追加する. こうすると,

$ echo a | node test2.js
a
---close---

となり,echo backが消える.