231

私はこの簡単なスクリプトを持っています:

var exec = require('child_process').exec;

exec('coffee -cw my_file.coffee', function(error, stdout, stderr) {
    console.log(stdout);
});

ここでは、コマンドを実行してコーヒースクリプトファイルをコンパイルするだけです。ただし、コマンドが終了しないため(coffeeの-wオプションのため)、stdoutがコンソールに表示されることはありません。コンソールから直接コマンドを実行すると、次のようなメッセージが表示されます。

18:05:59 - compiled my_file.coffee

私の質問は:これらのメッセージをnode.js execで表示することは可能ですか?はいの場合、どのように?!

ありがとう

4

9 に答える 9

309

使用しないでくださいexecspawnオブジェクトであるを使用しEventEmmiterます。stdout次に、 /stderrイベント(spawn.stdout.on('data',callback..)が発生したときにそれを聞くことができます。

NodeJSドキュメントから:

var spawn = require('child_process').spawn,
    ls    = spawn('ls', ['-lh', '/usr']);

ls.stdout.on('data', function (data) {
  console.log('stdout: ' + data.toString());
});

ls.stderr.on('data', function (data) {
  console.log('stderr: ' + data.toString());
});

ls.on('exit', function (code) {
  console.log('child process exited with code ' + code.toString());
});

exec出力をバッファリングし、通常、コマンドの実行が終了すると出力を返します。

于 2012-04-19T16:15:28.510 に答える
230

execEventEmitterであるChildProcessオブジェクトも返します。

var exec = require('child_process').exec;
var coffeeProcess = exec('coffee -cw my_file.coffee');

coffeeProcess.stdout.on('data', function(data) {
    console.log(data); 
});

またはpipe、子プロセスのstdoutからメインstdoutへ。

coffeeProcess.stdout.pipe(process.stdout);

またはspawnを使用してstdioを継承します

spawn('coffee -cw my_file.coffee', { stdio: 'inherit' });
于 2015-05-06T18:35:12.593 に答える
89

すでにいくつかの答えがありますが、それらのどれもこれを行うための最良の(そして最も簡単な)方法、つまり使用spawn{ stdio: 'inherit' }オプションについて言及していません。たとえば、からの進行状況情報を表示する場合に、最も正確な出力を生成するようgit cloneです。

単にこれを行います:

var spawn = require('child_process').spawn;

spawn('coffee', ['-cw', 'my_file.coffee'], { stdio: 'inherit' });

このコメントでこれを指摘してくれた@MorganTouvereyQuillingの功績です。

于 2017-04-18T16:15:23.603 に答える
23

ナタナエル・スミスの答えとエリック・フリーズのコメントに触発されて、それは次のように単純かもしれません:

var exec = require('child_process').exec;
exec('coffee -cw my_file.coffee').stdout.pipe(process.stdout);
于 2016-01-18T10:39:02.533 に答える
21

スポーンされたプロセスからバッファ文字列を出力する際の小さな問題の1つconsole.log()は、改行が追加されることです。これにより、スポーンされたプロセスの出力が追加の行に広がる可能性があります。の代わりにstdoutまたはstderrを使用して出力すると、生成されたプロセスからコンソール出力が「そのまま」取得されます。process.stdout.write()console.log()

私はここでその解決策を見ました: Node.js:末尾の改行なしでコンソールに印刷しますか?

上記のソリューションを使用している人に役立つことを願っています(ドキュメントからのものであっても、ライブ出力に最適です)。

于 2014-07-29T11:54:27.117 に答える
18

これを行うユーティリティにカスタムexecスクリプトを追加すると便利です。

Utilities.js

const { exec } = require('child_process')

module.exports.exec = (command) => {
  const process = exec(command)

  process.stdout.on('data', (data) => {
    console.log('stdout: ' + data.toString())
  })

  process.stderr.on('data', (data) => {
    console.log('stderr: ' + data.toString())
  })

  process.on('exit', (code) => {
    console.log('child process exited with code ' + code.toString())
  })
}

app.js

const { exec } = require('./utilities.js')

exec('coffee -cw my_file.coffee')
于 2017-10-07T06:26:11.710 に答える
5

他のすべての答えを確認した後、私はこれに行き着きました:

function oldSchoolMakeBuild(cb) {
    var makeProcess = exec('make -C ./oldSchoolMakeBuild',
         function (error, stdout, stderr) {
             stderr && console.error(stderr);
             cb(error);
        });
    makeProcess.stdout.on('data', function(data) {
        process.stdout.write('oldSchoolMakeBuild: '+ data);
    });
}

複数行になる場合もdataあるため、oldSchoolMakeBuildヘッダーは複数行に1回表示されます。しかし、これは私がそれを変更するのに十分な気にはなりませんでした。

于 2016-11-11T17:15:36.360 に答える
3

child_process.spawnは、stdoutストリームとstderrストリームを持つオブジェクトを返します。stdoutストリームをタップして、子プロセスがノードに送り返すデータを読み取ることができます。ストリームであるstdoutには、「data」、「end」、およびストリームが持つその他のイベントがあります。spawnは、子プロセスが大量のデータをノードに返す場合(画像処理、バイナリデータの読み取りなど)に最適です。

したがって、以下で使用するように、child_process.spawnを使用して問題を解決できます。

var spawn = require('child_process').spawn,
ls = spawn('coffee -cw my_file.coffee');

ls.stdout.on('data', function (data) {
  console.log('stdout: ' + data.toString());
});

ls.stderr.on('data', function (data) {
  console.log('stderr: ' + data.toString());
});

ls.on('exit', function (code) {
  console.log('code ' + code.toString());
});
于 2018-05-15T07:06:37.140 に答える
1

これがtypescriptで書かれた非同期ヘルパー関数で、私にとってはうまくいくようです。これは長期的なプロセスでは機能しないと思いますが、それでも誰かにとっては便利かもしれません。

import * as child_process from "child_process";

private async spawn(command: string, args: string[]): Promise<{code: number | null, result: string}> {
    return new Promise((resolve, reject) => {
        const spawn = child_process.spawn(command, args)
        let result: string
        spawn.stdout.on('data', (data: any) => {
            if (result) {
                reject(Error('Helper function does not work for long lived proccess'))
            }
            result = data.toString()
        })
        spawn.stderr.on('data', (error: any) => {
            reject(Error(error.toString()))
        })
        spawn.on('exit', code => {
            resolve({code, result})
        })
    })
}
于 2020-04-27T09:02:24.847 に答える