私はNode.jsでプログラムを作成しています(これは、状況によっては)単純なフィルターとして機能する必要があります。標準入力(ファイルの終わりまで)からすべてを読み取り、処理を行い、結果を標準出力に書き込みます。
「標準入力からすべてを読み取る」部分はどのように行うのですか?私がこれまでに見つけた最も近い解決策は、コンソールから一度に1行ずつ機能するか、stdinがパイプではなくファイルである場合にのみ機能するようです。
これのボイラープレートは、上記のコメントで説明されている解決策とよく似ています。これは、これを行う最も簡単な方法であり、コメントだけでなく、トップレベルで提供するためです。
var fs = require('fs');
var data = fs.readFileSync(0, 'utf-8');
// Data now points to a buffer containing the file's contents
Linuxを使用している場合は、このためのサードパーティパッケージは必要ありません。もちろん、パフォーマンスのニーズを考慮してください。ただし、次の2行で十分です。
const fs = require("fs");
const data = fs.readFileSync("/dev/stdin", "utf-8");
Janは以下のコメントで、より移植性の高いソリューションは0
、これはPOSIX標準であるため。したがって、簡単に使用できます。
const fs = require("fs");
const data = fs.readFileSync(0, "utf-8");
data
は、utf 8として解釈されるstdinからのデータを含む文字列になりました
get-stdin はトリックを実行します。
質問の行の間を読んでいるいくつかのメモ。
「synchronous」という質問にタグを付けたので、stdinはnode.jsで非同期のみであることに注意してください。上記のライブラリは、最もシンプルです。入力全体を文字列またはバッファとして扱います。
可能な場合は、ストリーミングスタイルでプログラムを作成するのが最適ですが、一部のユースケースはストリーミングに適しています(つまり、ワード数)。
また、「コンソールから一度に1行」は、キーストロークをバッファリングする端末のアーティファクトです。 「ごめんなさい」というレベルの詳細が必要な場合は、すばらしい TTY Demystified を確認してください。
Node 11+
async function read(stream) {
let buffer = Buffer.alloc(0);
for await (const chunk of stream) {
buffer = Buffer.concat([buffer, chunk]);
}
return buffer.toString('utf8');
}
使用法:
const input = await read(process.stdin);