同步子进程在正在开发的 Node.js 版本(即不稳定)中调用 are now available。这对于编写shell脚本是个好消息,因为它将允许如下代码:

var history = child_process.execSync('git log', { encoding: 'utf8' });
process.stdout.write(history);

但是,对于针对当前稳定版 Node.js (v0.10.30) 的代码,同步子进程调用是 not available,除非通过外部库。两个最流行的此类库似乎是 shelljsexec-sync

对于打算与 v0.10.x 一起使用并且必须调用二进制文件或其他可执行文件并处理其输出的 shell 脚本,这两个库或其他类似库的相对优缺点是什么?如果合适,请提供代码示例以供说明。

最佳答案

让我们看一下三个选项:问题中提到的两个选项,加上 execsync

shelljs
shelljs 不仅仅是用于调用子进程的库。首先,它是一个跨平台的JavaScript实现的几个POSIX实用程序和shell内建的:>catcdchmodcpdirsechoenvexecexitfindgreplnlsmkdirmvpopd , pushd , pwd , rm , sed , test , which 。它还提供了一些有用的功能:error()tempdir()

它的 exec 函数可用于同步运行外部可执行文件。

语法范例

使用全局命名空间:

require('shelljs/global');
var version = exec('node --version', {silent:true}).output;
console.log('version ' + version);

或者,使用本地命名空间:
var sh = require('shelljs');
var version = sh.exec('node --version', {silent:true}).output;
console.log('version ' + version);

关键数据/规范
  • 依赖项:0
  • 家属:411
  • 本月下载量:957851
  • 许可证:BSD*

  • 优点
  • 没有依赖关系。
  • 可以根据开发人员的判断通过全局或本地命名空间使用。
  • 大量的依赖包和用户,因此可能会继续使用一段时间。

  • 缺点
  • 无法区分被调用的可执行文件到 stderr 的输出和它到 stdout 的输出。 Bug ?
  • shelljs 文档 warns ,“对于长期存在的进程,最好异步运行 exec(),因为当前的同步实现使用大量 CPU。这应该很快得到修复。”

  • exec-sync/execSync

    exec-sync 一直是 retired 支持 execSync 。因此,本节的其余部分将引用后者。

    execSync库由围绕C++核心的JavaScript包装器组成。在安装execSync的过程中,C++核心被编译为适合平台的NodeJS二进制模块。

    语法示例
    var sh = require('execSync');
    var version = sh.exec('node --version').stdout;
    console.log('version ' + version);
    

    关键数据/规范
  • 依赖项:1
  • 家属:91
  • 本月下载量:20525
  • 许可证:麻省理工学院

  • 优点
  • 一旦安装就很简单。
  • 大量依赖包和用户,因此可能会继续使用一段时间。

  • 缺点
  • 不是无依赖的。
  • 安装需要 C++ 编译器。
  • 无法区分被调用的可执行文件到 stderr 的输出和它到 stdout 的输出。 Bug ?

  • execsync

    在这里值得一提的是,任何不区分大小写的搜索引擎,其他算法或人工操作都容易将execSync与execSync(请参见上文)混淆。更令人困惑的是,execsync 的作者在 execsync 的代码和文档中的几个地方使用了正字法“execSync”。

    像上面的execSync一样,execsync库由围绕C++核心的JavaScript包装器组成。在 execsync 的安装过程中,C++ 核心被编译成适合平台的 NodeJS 二进制模块。

    语法示例
    var sh = require('execsync');
    var version = sh('node --version');
    console.log('version ' + version);
    

    关键数据/规范
  • 依赖项:0
  • 家属:3
  • 本月下载量:20233
  • 执照:NYSL

  • 优点
  • 没有依赖关系。

  • 缺点
  • 不一致的内部正字法。
  • 安装需要 C++ 编译器。
  • 文档是日文的(不可否认,不是每个人的“骗局”)。
  • 无法区分被调用的可执行文件到 stderr 的输出和它到 stdout 的输出。
  • 依赖者数量很少,因此在 Node.js 社区中的根深蒂固可能较少。
  • 关于javascript - 同步子进程调用 Node.js 0.10.x 中的 shell 脚本(包括 CLI),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25320047/

    10-16 19:48