sam*_*per 7 javascript shell popen command-line-interface node.js
现在可以在正在开发的Node.js版本中使用同步子进程调用(即不稳定).这对于编写shell脚本来说是个好消息,因为它允许这样的代码:
var history = child_process.execSync('git log', { encoding: 'utf8' });
process.stdout.write(history);
Run Code Online (Sandbox Code Playgroud)
但是,对于针对当前稳定版本的Node.js(v0.10.30)的代码,除了通过外部库之外,不能使用同步子进程调用.两个最流行的这样的库似乎是shelljs和exec-sync.
对于打算与v0.10.x一起使用的shell脚本,必须调用二进制文件或其他可执行文件并处理它们的输出,这两个库或其他类似库的相对优缺点是什么?如果合适,请提供代码示例以供说明.
sam*_*per 12
让我们看看三个选项:问题中提到的两个选项,加上execsync.
shelljs不仅仅是一个用于调用子进程的库.首先,它是一个跨平台的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);
Run Code Online (Sandbox Code Playgroud)
或者,使用本地命名空间:
var sh = require('shelljs');
var version = sh.exec('node --version', {silent:true}).output;
console.log('version ' + version);
Run Code Online (Sandbox Code Playgroud)
exec-sync已经退役,有利于execSync.因此,本节的其余部分涉及后者.
execSync库包含一个围绕C++核心的JavaScript包装器.在安装execSync期间,C++内核被编译成适合平台的NodeJS二进制模块.
var sh = require('execSync');
var version = sh.exec('node --version').stdout;
console.log('version ' + version);
Run Code Online (Sandbox Code Playgroud)
值得一提的是,它很容易被execSync(见上文)与任何不区分大小写的搜索引擎,其他算法或人类混淆.令人困惑的是,execsync的作者在execsync的代码和文档中的几个点使用了拼写法"execSync".
与上面的execSync一样,execsync库包含一个围绕C++核心的JavaScript包装器.在安装execsync期间,C++内核被编译为适合平台的NodeJS二进制模块.
var sh = require('execsync');
var version = sh('node --version');
console.log('version ' + version);
Run Code Online (Sandbox Code Playgroud)