在Node.js 0.10.x中调用shell脚本(包括CLI)的同步子进程
Synchronous child process calls for shell scripting (including CLI) in Node.js 0.10.x
同步子进程调用现在在正在开发(即不稳定)的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社区中不那么根深蒂固。
- 包括用于facebook评论框的JavaScript SDK
- 查找元素高度,包括边距
- asp.net,包括iss上的javascript slow
- SuiteScript2.0-包括一个自定义文件
- javascript加密实现,包括可信否认
- 使用Ember-cli项目中的ES6库
- 在ng中给出文件路径包括什么
- 包括angular 1.3.0项目上的angular bootstrap ui
- 如何将单词(包括单词)与连字符匹配
- 根据下拉值包括或加载php
- 根据另一个数组对数组进行排序,包括位置和字符串[ES6]
- PHP 包括 Javascript 生成的文件名
- 包括android中的HTML UI
- 如何将页面上的所有电话号码更改为可点击链接,不包括特定类别的元素
- Javascript:包括特殊字符的文本选择
- 包括php文件和几个js文件
- spin.js/angular spinner:如何将spin定位到DOM元素中(包括plunker演示)
- 如何获取node.js系统CLI应用程序的位置
- 在Node.js 0.10.x中调用shell脚本(包括CLI)的同步子进程
- 我如何改变引导字体包括url从相对到绝对使用Aurelia cli时