[node.js] child_process.execSync를 사용하지만 콘솔에서 출력을 유지하십시오.

execSyncNodeJS 0.12에 추가 된 방법 을 사용하고 싶지만 여전히 Node 스크립트를 실행 한 콘솔 창에 출력이 있습니다.

예를 들어 다음 줄이있는 NodeJS 스크립트를 실행하면 콘솔 내에서 “live”rsync 명령의 전체 출력을보고 싶습니다.

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

execSync명령의 출력 을 반환하고 실행 후에 콘솔에 인쇄 할 수 있지만이 방법으로 “실시간”출력이 없다는 것을 이해합니다 …



답변

원하는 경우 부모의 stdio를 자식 프로세스로 전달할 수 있습니다 .

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


답변

간단하게 사용할 수 있습니다 .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-중간에 확실하지 않습니다.


답변

허용 된 답변이 제안하는대로 stdout 및 stderr을 리디렉션하지 않으면 execSync 또는 spawnSync로는 불가능합니다. stdout 및 stderr을 경로 재지 정하지 않으면 해당 명령은 명령이 완료 될 때만 stdout 및 stderr을 리턴합니다.

stdout 및 stderr을 리디렉션하지 않고이 작업을 수행하려면 스폰을 사용 하여이 작업을 수행해야하지만 매우 간단합니다.

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은 실행하려는 실행 파일 이름을 첫 번째 인수로 사용하고 두 번째 인수는 해당 실행 파일에 전달하려는 각 매개 변수를 나타내는 문자열 배열을 사용합니다.

그러나 execSync를 사용하도록 설정했는데 어떤 이유로 stdout 또는 stderr을 리디렉션 할 수없는 경우 xterm과 같은 다른 터미널을 열고 다음과 같이 명령을 전달할 수 있습니다.

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

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

그러면 새 터미널에서 명령이 수행하는 작업을 볼 수 있지만 여전히 동기식 호출이 가능합니다.


답변