node.js 同步执行系统命令

IT技术 javascript command node.js exec sync
2021-01-21 16:49:17

我需要在node.js函数中

result = execSync('node -v');

这将同步执行给定的命令行并返回该命令文本的所有标准输出。

附:同步错误。我知道。仅供个人使用。

更新

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

更新

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

更新 2014-07-30

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


更新 2015-02-10

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

6个回答

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

child_process.execSync(command[, options])

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

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

它会做你所期望的。(默认将 i/o 结果通过管道传输到父进程)。请注意,您spawnSync现在可以。

那是一个缓冲区,你可以把它串起来
2021-03-12 16:49:17
经过10个小时的绝望。多谢,伙计
2021-03-27 16:49:17
我怎样才能与这个子进程断开连接?
2021-04-01 16:49:17
@JulianSoto nodejs.org/api/...
2021-04-08 16:49:17
当我 execSync('node -v') 时它返回 <Buffer 76 31 31 2e 36 2e 30 0a>,那是什么?
2021-04-10 16:49:17

请参阅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 月:如何获得标准输出]

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'));
你会如何真正stdout从这里得到任何东西我能得到的只是进程退出代码
2021-03-22 16:49:17
@pvorb——是的,除非你不能使用 async :)
2021-03-25 16:49:17
@cwolves:我认为异步会更好。伊沃的回答
2021-03-28 16:49:17
不为每个钉子使用异步锤是有正当理由的。例如,模板引擎在 Express 3 中是异步的,而辅助函数(本地)需要同步。如果这些辅助函数需要即时异步编译 Less 文件怎么办?
2021-04-01 16:49:17
我想知道为什么这个简单execSync的不是child_process. 我想,应该是。
2021-04-04 16:49:17

使用ShellJSmodule。

exec函数而不提供回调。

例子:

var version = exec('node -v').output;
选项,{silent:true} 是关键
2021-03-22 16:49:17
请注意,在撰写本文时,文档提到同步exec()对于长进程来说是 CPU 密集型的。
2021-03-27 16:49:17
这做了一些事情(除了提供更短的语法)这不是吗? const execSync = require('child_process').execSync; code = execSync('node -v');
2021-04-08 16:49:17

node.js 中有一个出色的流量控制module,称为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...');
});
@AlexeyPetrushin 这里的每个问题都是关于一个目标,而不是关于实现它的特定方法。感谢您的反对。
2021-03-14 16:49:17
他明确询问同步版本,而不是控制流库。
2021-03-21 16:49:17
此外,这对 Windows 用户来说是一个非常有用的答案;在 Windows 上安装exec-syncffi具有巨大的开销(VC++、SDK、Python 等),但它更轻。
2021-04-01 16:49:17

这是不可能的Node.js,都child_process.spawnchild_process.exec从地面建是异步。

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

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

或者,如果您有太多时间可以花,可以自行在 Node.js 中进行破解。

@IvoWetzel - tisk tisk ......我们没有学会永远不要说不可能的事情吗?;) 请参阅下面的我的解决方案。
2021-03-14 16:49:17
异步很好,但是如果 WidgetB 依赖于 WidgetA 的最终结果,那么世界上所有的异步都无法完成工作。有时进程必须是同步的。尝试异步烹饪。;)
2021-03-15 16:49:17
奇怪,因为文件系统module有同步调用。为什么不也执行?
2021-03-21 16:49:17
@Alfred 同步 FS 调用主要用于在程序启动时加载配置。
2021-03-27 16:49:17
@IvoWetzel“同步 FS 调用...”-是的,有时您想发出一个命令来在程序启动时编译某些内容并在完成时继续。-假设有同步 FS 调用,而没有同步 exec确实看起来像是一个疏忽。我完全支持异步,但同步确实有其优点和用例。当然,必须以明智的方式使用它。
2021-04-08 16:49:17