【问题标题】:Synchronous child process calls for shell scripting (including CLI) in Node.js 0.10.xNode.js 0.10.x 中的同步子进程调用 shell 脚本(包括 CLI)
【发布时间】:2014-08-15 01:32:21
【问题描述】:

在正在开发(即不稳定)的 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 脚本,并且必须调用二进制文件或其他可执行文件并处理它们的输出,这两个库或其他类似库的相对优缺点是什么?如果合适,请提供代码示例以进行说明。

【问题讨论】:

  • 虽然这是一个写得很好的问题,但这可能会因为过于基于意见而被关闭:-/
  • 谢谢。我希望它不会被关闭,因为它看起来非常合适:本质上是对 this question 的改进。但是,如果您认为我应该将其标记为迁移到 softwarerecs.stackexchange.com 或类似网站,请务必说明
  • 嗯,我也不知道是不是on-topic there
  • 好吧,我不是在征求意见,我是在询问两种精确指定的替代编程策略的具体优点/缺点(在这种情况下,使用一个库与使用另一个库,用于相同的任务)。多年来,此类问题已在 SO 上提出和回答。无论如何,在 SO/SE 上有inclusionism 的空间:)

标签: javascript node.js shell popen command-line-interface


【解决方案1】:

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

shelljs

shelljs 不仅仅是一个调用子进程的库。首先,它是几个 POSIX 实用程序和 shell 内置函数的跨平台 JavaScript 实现:>catcdchmodcpdirsechoenvexecexitfindgreplnlsmkdirmvpopdpushdpwdrmsedtestwhich。它还提供了一些自己的有用功能: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 库由一个围绕 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 社区中的地位可能较低。

【讨论】:

  • +1 自己回答这个问题。您甚至可以从问题中删除特定的包,使其更加开放:-)
  • 谢谢 :) 我在问题中添加了文本“或其他类似的库”。
  • 为什么我们需要一个库来做这个,spawnAsync 不做吗?
  • @SuperUberDuper,不,它没有。它用于异步使用。
猜你喜欢
  • 1970-01-01
  • 2013-09-26
  • 2013-04-16
  • 2017-02-21
  • 2020-05-22
  • 2012-06-04
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
相关资源
最近更新 更多