节点.js同步执行系统命令

2022-08-30 01:18:41

我需要在节点中.js函数

result = execSync('node -v');

同步执行给定的命令行并返回该命令文本的所有 stdout。

ps. 同步是错误的。我知道。仅供个人使用。

更新

现在我们有mgutz的解决方案,它为我们提供了退出代码,但不是stdout!仍在等待更准确的答案。

更新

mgutz更新了他的答案,解决方案在这里 :)
此外,正如dgo.a所提到的,有独立的模块exec-sync

更新 2014-07-30

ShellJS lib到了。认为这是目前的最佳选择。


更新 2015-02-10

最后!NodeJS 0.12 原生支持。
查看官方文档execSync


答案 1

Node.js(从版本0.12开始 - 所以一段时间)支持execSync

child_process.execSync(command[, options])

您现在可以直接执行以下操作:

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

它会做你期望的。(默认将 I/O 结果通过管道传送到父进程)。请注意,您现在也可以生成Sync


答案 2

请参阅 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'));