[javascript] node.js는 시스템 명령을 동 기적으로 실행합니다

node.js 함수 가 필요 합니다

result = execSync('node -v');

주어진 명령 줄 을 동 기적으로 실행하고 해당 명령 텍스트로 모든 표준을 반환합니다.

추신. 동기화가 잘못되었습니다. 알아. 개인적인 용도로만 사용하십시오.

최신 정보

이제 종료 코드를 제공하지만 stdout은 제공하지 않는 mgutz의 솔루션이 있습니다! 더 정확한 답변을 기다리는 중입니다.

최신 정보

mgutz는 그의 대답을 업데이트했고 해결책은 여기에 있습니다 🙂
또한 dgo.a에서 언급했듯이 독립형 모듈 exec-sync가 있습니다.

2014-07-30 업데이트

ShellJS lib가 도착했습니다. 이것이 현재 최선의 선택이라고 생각하십시오.


업데이트 2015-02-10

마지막에! NodeJS 0.12는 execSync기본적으로 지원합니다 .
공식 문서를 참조하십시오



답변

Node.js (버전 0.12부터-잠시 동안)는 execSync다음을 지원합니다 .

child_process.execSync(command[, options])

이제 직접 할 수 있습니다 :

const execSync = require('child_process').execSync;
code = execSync('node -v');

그리고 당신이 기대하는 것을 할 것입니다. (i / o 결과를 상위 프로세스로 파이프하는 기본값) 참고 수행 할 수도 있습니다 spawnSync지금.


답변

execSync 라이브러리를 참조하십시오 .

node-ffi로하 는 것은 상당히 쉽습니다 . 서버 프로세스에는 권장하지 않지만 일반적인 개발 유틸리티의 경우에는 작업이 완료됩니다. 라이브러리를 설치하십시오.

npm install node-ffi

스크립트 예 :

var FFI = require("node-ffi");
var libc = new FFI.Library(null, {
  "system": ["int32", ["string"]]
});

var run = libc.system;
run("echo $USER");

[편집 2012 년 6 월 : STDOUT를 얻는 방법]

var lib = ffi.Library(null, {
    // FILE* popen(char* cmd, char* mode);
    popen: ['pointer', ['string', 'string']],

    // void pclose(FILE* fp);
    pclose: ['void', [ 'pointer']],

    // char* fgets(char* buff, int buff, in)
    fgets: ['string', ['string', 'int','pointer']]
});

function execSync(cmd) {
  var
    buffer = new Buffer(1024),
    result = "",
    fp = lib.popen(cmd, 'r');

  if (!fp) throw new Error('execSync error: '+cmd);

  while(lib.fgets(buffer, 1024, fp)) {
    result += buffer.readCString();
  };
  lib.pclose(fp);

  return result;
}

console.log(execSync('echo $HOME'));


답변

ShellJS 모듈을 사용하십시오 .

콜백을 제공하지 않고 exec 함수.

예:

var version = exec('node -v').output;


답변

node.js에는 asyncblock 이라는 흐름 제어를위한 훌륭한 모듈이 있습니다 . 함수에 코드를 래핑하는 것이 괜찮다면 다음 샘플을 고려할 수 있습니다.

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

asyncblock(function (flow) {
    exec('node -v', flow.add());
    result = flow.wait();
    console.log(result);    // There'll be trailing \n in the output

    // Some other jobs
    console.log('More results like if it were sync...');
});


답변

이 Node.js를에 가능하지 않다, 모두 child_process.spawnchild_process.exec비동기로 처음부터 건설되었다.

자세한 내용은 https://github.com/ry/node/blob/master/lib/child_process.js 를 참조하십시오.

이 블로킹을 실제로 원한다면 나중에 콜백에 필요한 모든 것을 넣거나 블로킹 방식으로 처리하기 위해 자신의 대기열을 작성하려면 이 작업에 Async.js 를 사용할 수 있다고 가정합니다 .

또는 너무 많은 시간을 할애 할 수없는 경우 Node.js에서 스스로 해킹하십시오.


답변

이것이 내가 찾은 가장 쉬운 방법입니다.

exec-Sync :
https://github.com/jeremyfa/node-exec-sync(execSync

와 혼동하지 마십시오.)

셸 명령을 동 기적으로 실행합니다. 마이그레이션 스크립트, cli 프로그램에는 사용하지만 일반 서버 코드에는 사용하지 마십시오.

예:

var execSync = require('exec-sync');
var user = execSync('echo $USER');
console.log(user);


답변

그냥 몇 가지 쓰임새가 비록 당신이 그들을 사용해야하는 곳 추가하려면, spawnSync/ execFileSync/ execSync이 커밋에서 Node.js를 추가했다 : https://github.com/joyent/node/compare/d58c206862dc…e8df2676748e