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


160

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

たとえば、次の行を含むNodeJSスクリプトを実行すると、コンソール内でrsyncコマンドの「ライブ」の完全な出力が表示されます。

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

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

回答:


324

必要な場合親のstdioを子プロセスに渡すことができます

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

3
これは、子プロセスが親のstdin、stdout、およびstderrストリームを使用することを意味します。したがって、子プロセスがそれらのいずれかに書き込むと、実際には親のストリームに直接書き込まれます。
集約担当者、2015年

7
これは非常に貴重な回答です。公式のドキュメントでは、予想される構文について明確に説明されていないからです。
chikamichi

49
[0,1,2]私が使用した代わりに'inherit'、これはドキュメントと同等[process.stdin, process.stdout, process.stderr]またはドキュメント[0,1,2]ごとに
Kurt

10
options.stdioドキュメントへの正しいリンク:nodejs.org/api/child_process.html#child_process_options_stdio
Shaun

2
@Booligoosh単純にを追加する代わりに、{stdio:'inherit'}.toString()を追加してから、結果とともにconsole.logを手動で呼び出す必要があります。さらに、コマンドの出力を「ライブ」で見るという質問の要件も満たしていません。私はそれが「ずっと単純」だとは思っていません。実際、私はそれがまったく単純だとはまったく思っていません。
boileau 2017年

19

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

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

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


3
これは.execSync()Errorインスタンスをスローするため、失敗(ステータスコード!= 0)では機能しません。
アルバロ・ゴンサレス

私には機能しません。つまり、出力はコマンドが終了した後にのみ書き込まれます。これは特定のバージョンに適用されますか?私のノード-v:v6.3.1
etov

回答を更新して、特定のノードバージョンにのみ適用できることを確認してください-これにより、他の
ユーザー

1
コマンド中の出力に関する質問にtiが関連しているため、反対投票が実行されます。
karfau

14

受け入れられた回答が示唆するように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 /");

これにより、新しい端末でのコマンドの動作を確認できますが、同期呼び出しは引き続き可能です。


2
spawnを使用する例は正しいかもしれませんが、execSyncを使用しないことについての開始ステートメントは正確ではありません。@gregersからの回答を参照
AgDude 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.