我需要在node.js函数

result = execSync('node -v');

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

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

更新

现在我们有了mgutz的解决方案,它给出了退出代码,但没有stdout!还在等更确切的答案。

更新

Mgutz更新了他的答案,解决方案在这里:) 同样,作为dgo。一提到,有一个独立的模块execc -sync

更新2014-07-30

ShellJS lib到了。考虑到这是目前最好的选择。


更新2015-02-10

终于!NodeJS 0.12原生支持execSync。 查看官方文件


当前回答

我也遇到过类似的问题,最后我为此写了一个节点扩展。您可以查看git存储库。它是开源的,免费的,还有所有这些好东西!

https://github.com/aponxi/npm-execxi

ExecXI是一个用c++编写的用于执行shell命令的节点扩展 依次将命令的输出输出到控制台中 实时的。有可选的链式和非链式方式;意义 您可以选择在命令失败后停止脚本 (被锁住),或者你可以继续,就当什么都没发生!

使用说明在ReadMe文件中。请随意进行拉请求或提交问题!

编辑:但是它还没有返回标准输出…只是实时输出。现在有了。嗯,我今天刚刚发布。也许我们可以以此为基础。

不管怎样,我觉得值得一提。

其他回答

我也遇到过类似的问题,最后我为此写了一个节点扩展。您可以查看git存储库。它是开源的,免费的,还有所有这些好东西!

https://github.com/aponxi/npm-execxi

ExecXI是一个用c++编写的用于执行shell命令的节点扩展 依次将命令的输出输出到控制台中 实时的。有可选的链式和非链式方式;意义 您可以选择在命令失败后停止脚本 (被锁住),或者你可以继续,就当什么都没发生!

使用说明在ReadMe文件中。请随意进行拉请求或提交问题!

编辑:但是它还没有返回标准输出…只是实时输出。现在有了。嗯,我今天刚刚发布。也许我们可以以此为基础。

不管怎样,我觉得值得一提。

这在Node.js中是不可能的,无论是child_process。Spawn和child_process。Exec是从底层构建为异步的。

详情见:https://github.com/ry/node/blob/master/lib/child_process.js

如果你真的想要这种阻塞,那么把所有需要发生的事情都放在回调中,或者构建自己的队列以阻塞的方式处理它,我想你可以使用Async.js来完成这个任务。

或者,如果你有太多的时间,可以在Node.js中自己动手。

只是补充一点,尽管你应该使用它们的用例很少,但在这些提交中,spawnSync / execFileSync / execSync被添加到node.js: https://github.com/joyent/node/compare/d58c206862dc...e8df2676748e

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

您可以使用纤维来实现这一点。例如,使用我的Common Node库,代码看起来是这样的:

result = require('subprocess').command('node -v');