同步子进程在Node.js 0.10.x中调用shell脚本(包括CLI)

sam*_*per 7 javascript shell popen command-line-interface node.js

现在可以在正在开发的Node.js版本中使用同步子进程调用(即不稳定).这对于编写shell脚本来说是个好消息,因为它允许这样的代码:

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

但是,对于针对当前稳定版本的Node.js(v0.10.30)的代码,除了通过外部库之外,不能使用同步子进程调用.两个最流行的这样的库似乎是shelljsexec-sync.

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

sam*_*per 12

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

shelljs

shelljs不仅仅是一个用于调用子进程的库.首先,它是一个跨平台的JavaScript的几个POSIX实用程序和shell内建的执行:>,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);
Run Code Online (Sandbox Code Playgroud)

或者,使用本地命名空间:

var sh = require('shelljs');
var version = sh.exec('node --version', {silent:true}).output;
console.log('version ' + version);
Run Code Online (Sandbox Code Playgroud)

主要统计数据/规格

  • 依赖关系:0
  • 家属:411
  • 本月下载:957851
  • 执照:BSD*

优点

  • 没有依赖.
  • 可由开发人员自行决定通过全局或本地命名空间使用.
  • 大量的依赖包和用户,因此可能会在一段时间内保持使用.

缺点

  • 无法区分被调用的可执行文件的输出到stderr从其输出到stdout.错误
  • shelljs文档警告说,"对于长期存在的进程,最好以异步方式运行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);
Run Code Online (Sandbox Code Playgroud)

主要统计数据/规格

  • 依赖性:1
  • 家属:91
  • 本月下载:20525
  • 执照:麻省理工学院

优点

  • 一旦安装就直截了当.
  • 大量的依赖包和用户,因此可能会在一段时间内保持使用状态.

缺点

  • 不依赖于自由.
  • 安装需要存在C++编译器.
  • 无法区分被调用的可执行文件的输出到stderr从其输出到stdout.错误

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);
Run Code Online (Sandbox Code Playgroud)

主要统计数据/规格

  • 依赖关系:0
  • 家属:3
  • 本月下载:20233
  • 执照:纽约证券交易所

优点

  • 没有依赖.

缺点

  • 内部正字法不一致.
  • 安装需要存在C++编译器.
  • 文件是日文的(不可否认,不是每个人的"骗局").
  • 无法区分被调用的可执行文件的输出到stderr从其输出到stdout.
  • 少数家属,因此可能在Node.js社区中根深蒂固.