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脚本,必须调用二进制文件或其他可执行文件并处理它们的输出,这两个库或其他类似库的相对优缺点是什么?如果合适,请提供代码示例以供说明.
解决方法
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().
语法示例
使用全局命名空间
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 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库包含围绕C核的JavaScript包装器.在安装execsync期间,C内核被编译成适合平台的NodeJS二进制模块.
语法示例
var sh = require('execsync'); var version = sh('node --version'); console.log('version ' + version);
主要统计数据/规格
>依赖关系:0
>家属:3
>本月下载:20233
>许可证:纽约证券交易所
优点
>没有依赖.
缺点
>内部正字法不一致.>安装需要存在C编译器.>文件是日文的(不可否认,不是每个人的“骗局”).>无法将被调用的可执行文件的输出与stderr从其输出区分为stdout.>少数家属,因此可能在Node.js社区中根深蒂固.