web-dev-qa-db-ja.com

child_process.execSyncを使用しますが、コンソールに出力を保持します

NodeJS 0.12で追加されたexecSyncメソッドを使用したいのですが、ノードスクリプトを実行したコンソールウィンドウに出力が残っています。

例えば。次の行を含むNodeJSスクリプトを実行する場合、コンソール内で「ライブ」rsyncコマンドの完全な出力を確認します。

require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"');

execSyncはコマンドの出力を返し、実行後にコンソールに出力できることを理解していますが、この方法では「ライブ」出力がありません...

118
suamikim

親の子プロセスへのstdio を渡すことができます。

require('child_process').execSync(
    'rsync -avAXz --info=progress2 "/src" "/dest"',
    {stdio: 'inherit'}
);
244
gregers

単に.toString()を使用できます。

var result = require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"').toString();
console.log(result);

これはノードv8.5.0でテストされています。以前のバージョンについてはわかりません。 @ etov によると、v6.3.1では動作しません-中間についてはわかりません。

15
Ethan

受け入れられた答えが示唆するようにstdoutとstderrをリダイレクトしない限り、execSyncまたはspawnSyncではこれは不可能です。 stdoutとstderrをリダイレクトしない場合、これらのコマンドは、コマンドが完了するとstdoutとstderrのみを返します。

Stdoutとstderrをリダイレクトせずにこれを行うには、spawnを使用してこれを行う必要がありますが、それは非常に簡単です:

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

//kick off process of listing files
var child = spawn('ls', ['-l', '/']);

//spit stdout to screen
child.stdout.on('data', function (data) {   process.stdout.write(data.toString());  });

//spit stderr to screen
child.stderr.on('data', function (data) {   process.stdout.write(data.toString());  });

child.on('close', function (code) { 
    console.log("Finished with code " + code);
});

Lsコマンドを使用して、ファイルを再帰的に一覧表示し、すばやくテストできるようにしました。 Spawnは、実行しようとしている実行可能ファイル名を最初の引数として受け取り、2番目の引数として、その実行可能ファイルに渡したい各パラメータを表す文字列の配列を受け取ります。

ただし、execSyncを使用するように設定されていて、何らかの理由でstdoutまたはstderrをリダイレクトできない場合は、xtermなどの別の端末を開いて、次のようなコマンドを渡すことができます。

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

execSync("xterm -title RecursiveFileListing -e ls -latkR /");

これにより、新しいターミナルでコマンドが実行していることを確認できますが、同期呼び出しは引き続き可能です。

14
Brian