同步子进程在正在开发的 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,除非通过外部库。两个最流行的此类库似乎是 shelljs 和 exec-sync 。
对于打算与 v0.10.x 一起使用并且必须调用二进制文件或其他可执行文件并处理其输出的 shell 脚本,这两个库或其他类似库的相对优缺点是什么?如果合适,请提供代码示例以供说明。
最佳答案
让我们看一下三个选项:问题中提到的两个选项,加上 execsync 。
shelljsshelljs
不仅仅是用于调用子进程的库。首先,它是一个跨平台的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);
或者,使用本地命名空间:
var sh = require('shelljs');
var version = sh.exec('node --version', {silent:true}).output;
console.log('version ' + version);
关键数据/规范
优点
缺点
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);
关键数据/规范
优点
缺点
execsync
在这里值得一提的是,任何不区分大小写的搜索引擎,其他算法或人工操作都容易将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);
关键数据/规范
优点
缺点
关于javascript - 同步子进程调用 Node.js 0.10.x 中的 shell 脚本(包括 CLI),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25320047/