そのコマンドの入力と出力をリダイレクトせずに、Node.js からシェル コマンドを起動しようとしています。シェル スクリプトや Ruby のコマンドを使用してコマンドにシェルを実行するのと同じsystem
です。子プロセスが STDOUT に書き込みたい場合は、コンソールに直接送信します (または、Node アプリの出力がリダイレクトされた場合はリダイレクトされます)。
ノードには、これを行う簡単な方法がないようです。別のプロセスを実行する唯一の方法は、子プロセスの入力と出力child_process
を常にパイプにリダイレクトする を使用することです。これらのパイプからデータを受け取り、それをプロセスの STDOUT および STDERR に書き込むコードを作成することはできますが、そうすると、API によってある程度の柔軟性が犠牲になります。
2 つの機能が必要です。
- シェル構文。コマンド間で出力をパイプしたり、Windows バッチ ファイルを実行したりしたいと考えています。
- 無制限の出力。私がコンパイラにシェルアウトしていて、メガバイトのコンパイラ警告を生成したい場合、ユーザーがうんざりして Ctrl + C を押すまで、それらすべてを画面上でスクロールさせたいと思います。
Node は、これら 2 つの機能のどちらかを選択するよう強制したいようです。
- 無制限の量の出力が必要な場合は、 を使用
child_process.spawn
して を実行child.stdout.on('data', function(data) { process.stdout.write(data); });
し、同じことをstderr
. 残念ながら、spawn
シェル構文はサポートされていません。 - シェル構文が必要な場合は、
child_process.exec
. しかしexec
、子プロセスの STDOUT と STDERR をバッファリングし、最後にそれらをすべて渡すことを主張し、それらのバッファのサイズを制限します (構成可能、デフォルトで 200K)。on('data')
生成された出力を確認したい場合は、引き続きイベントをフックできますexec
が、データもそのバッファーに追加します。データ量が定義済みのバッファ サイズを超えるexec
と、子プロセスが終了します。
(柔軟性の観点から、両方の世界で最悪child_process.execFile
の もあります。シェル構文はありませんが、期待する出力量を制限する必要があります。)
何か不足していますか?ノードの子プロセスにシェルアウトし、その入力と出力をリダイレクトしない方法はありますか? シェル スクリプトや Ruby などで利用できるように、シェル構文をサポートし、事前に定義された量の出力の後に無駄にならないものはありますか?