我需要在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。 查看官方文件


当前回答

这是我发现的最简单的方法:

exec-Sync: https://github.com/jeremyfa/node-exec-sync (不要与execSync混淆。) 同步执行shell命令。在迁移脚本、cli程序中使用这个选项,但不能用于常规的服务器代码。 例子:

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

其他回答

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

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

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

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

child_process.execSync(command[, options])

你现在可以直接这样做:

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

它会如你所愿。(默认为将i/o结果管道到父进程)。注意,你现在也可以生成同步。

在node.js中有一个很棒的流控制模块叫做asyncblock。如果在函数中包装代码对您的情况是OK的,那么可以考虑以下示例:

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...');
});

5年来,我的方法是有两条线;

const { execSync } = require('child_process');
const shell = (cmd) => execSync(cmd, {encoding: 'utf8'});

然后享受: Shell ('git remote -v') 或 Out = shell('ls -l') . .等等