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

Synchronous child process calls for shell scripting (including CLI) in Node.js 0.10.x

本文关键字:CLI 包括 子进程 同步 脚本 shell js Node 调用      更新时间:2023-09-26

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

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

然而,对于针对当前稳定版本Node.js (v0.10.30)的代码,除了通过外部库之外,同步子进程调用不可用。这类库中最流行的两个是shelljs和execc -sync。

用于在v0.10中使用的shell脚本。X,并且必须调用二进制文件或其他可执行文件并处理它们的输出,这两个库或其他可比较库的相对优缺点是什么?如有需要,请提供代码示例。

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

shelljs

shelljs不仅仅是一个调用子进程的库。首先,它是几个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文档警告说,"对于长寿命的进程,最好异步运行exec(),因为当前的同步实现使用大量CPU。这个问题应该很快就能解决。"

execc -sync/execSync

execc -sync已被execc -sync取代。因此,本节的其余部分涉及后者。

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++编译器。
  • 无法区分被调用的可执行文件的标准输出和标准输出。错误吗?

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++编译器。
  • 文档是日文的(不可否认,对每个人来说不是一个"骗局")。
  • 无法区分被调用的可执行文件的标准输出和标准输出。
  • 依赖的数量少,所以可能在Node.js社区中不那么根深蒂固。