同步subprocess调用Node.js 0.10.x中的shell脚本(包括CLI)
同步subprocess调用现在可用于正在开发(即不稳定)的Node.js版本。 这对编写shell脚本来说是个好消息,因为它会允许这样的代码:
var history = child_process.execSync('git log', { encoding: 'utf8' }); process.stdout.write(history);
但是,针对当前稳定版本的Node.js(v0.10.30)的代码,除了通过外部库之外,同步subprocess调用不可用 。 两个最stream行的这样的库似乎是shelljs和exec-sync 。
对于准备与v0.10.x一起使用的shell脚本,必须调用二进制文件或其他可执行文件并处理它们的输出,这两个库或其他类似库的相对优缺点是什么? 如果适用,请提供代码示例以供说明。
让我们看看三个选项:问题中提到的两个选项,再加上execsync 。
shelljs
shelljs
不仅仅是一个调用subprocess的库。 首先,它是几个POSIX实用程序和shell内置函数的跨平台JavaScript实现: >
, cat
, cd
, chmod
, cp
, dirs
, echo
, env
, exec
, exit
, find
, grep
, ln
, ls
, mkdir
, mv
, popd
, 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 *
优点
- 没有依赖关系。
- 开发人员可以通过全局或本地命名空间来使用。
- 庞大数量的依赖软件包和用户,很可能会在一段时间内继续使用。
缺点
- 无法区分被调用的可执行文件的输出到标准输出到标准输出。 错误 ?
- shelljs文档警告说 :“对于长寿命的进程,最好是asynchronous运行exec(),因为当前的同步实现使用了大量的CPU,这应该很快就会得到解决。
exec-sync / execSync
exec-sync已经退出,以支持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
- 许可证:MIT
优点
- 直接安装一次。
- 大量的依赖软件包和用户,因此可能会继续使用一段时间。
缺点
- 不依赖于自由。
- 安装需要存在一个C ++编译器。
- 无法区分被调用的可执行文件的输出到标准输出到标准输出。 错误 ?
execsync
这里值得一提,因为它很容易与任何不区分大小写的search引擎,其他algorithm或人为的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 ++编译器。
- 文件是日文的(不是所有人都认同的)。
- 无法区分被调用的可执行文件的输出到标准输出到标准输出。
- less数家属,因此可能在Node.js社区中根深蒂固。