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


160

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

예를 들어 다음 줄이있는 NodeJS 스크립트를 실행하면 콘솔 내에서 "live"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 스트림을 사용한다는 것을 의미합니다. 따라서 자식 프로세스가 두 프로세스 중 하나에 쓸 때 실제로 부모 스트림에 직접 쓰여집니다.
모임 2

7
공식 문서가 예상 구문에 대해 실제로 명시 적이 지 않기 때문에 이것은 매우 귀중한 답변입니다.
chikamichi

49
대신에 [0,1,2]내가 사용한 적이 'inherit'에 해당하는, [process.stdin, process.stdout, process.stderr]또는 [0,1,2]같은 당 문서
커트

10
에 대한 올바른 링크 options.stdio문서 : nodejs.org/api/child_process.html#child_process_options_stdio
숀 르브론

2
@Booligoosh 단순히을 추가하는 대신 {stdio:'inherit'}.toString ()을 추가 한 다음 결과와 함께 console.log를 수동으로 호출해야합니다. 또한 명령 출력 "live"를 보는 데 필요한 질문도 충족하지 않습니다. 나는 그것이 훨씬 더 단순하다고 생각하지 않는다. 사실 나는 그것이 더 단순하다고 생각하지 않는다.
boileau

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()throw 하기 때문에 실패 (상태 코드! = 0)에서는 작동하지 않습니다 Error.
Álvaro González

나를 위해 작동하지 않습니다. 즉, 명령이 완료된 후에 만 ​​출력이 작성됩니다. 특정 버전에도 적용됩니까? 내 노드 -v : v6.3.1
etov

답변을 업데이트하여 특정 노드 버전에만 적용 할 수 있습니다. 이는 다른 노드에게 더 유용 할 것입니다.
etov

1
ti는 명령 중 출력에 관한 질문과 관련하여 이제 하향 조정됩니다.
karfau

14

허용 된 답변이 제안하는대로 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 /");

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


2
spawn을 사용하는 예는 정확하지만 execSync를 사용하지 않을 것에 대한 개시 진술은 정확하지 않습니다. @gregers
AgDude의
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.