适用范围:
1. 优点:
- 多个shell命令都执行在同一个线程中
- 不想原生exec, 每次都会新建线程
2. 特点:
- 切换了目录, 就同时可以影响到后面的命令工作目录
梗概:
shelljs 将一些常用的shell命令包装成js函数
shelljs方法名就是我们常用的执行命令,而方法参数就是命令行参数。只是有些方法对命令行参数做了变形和拓展。
实例:
例子展示了一个可发布版本提交到git仓库的过程。
var shell = require('shelljs');
//判定git命令是否可用
if (!shell.which('git')) {
//向命令行打印git命令不可用的提示信息
shell.echo('Sorry, this script requires git');
//退出当前进程
shell.exit(1);
}
//先删除'out/Release'目录
shell.rm('-rf', 'out/Release');
//拷贝文件到'out/Release'目录
shell.cp('-R', 'stuff/', 'out/Release');
//切换当前工作目录到'lib'
shell.cd('lib');
//shell.ls('*.js')返回值是一个包含所有js文件路径的数组
shell.ls('*.js').forEach(function(file) {//遍历数组
//sed命令用于文件内容的替换,这里是对每个文件都执行如下3步操作,更改版本信息
shell.sed('-i', 'BUILD_VERSION', 'v0.1.2', file);
shell.sed('-i', /^.*REMOVE_THIS_LINE.*$/, '', file);
shell.sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, shell.cat('macro.js'), file);
});
//切换当前工作目录到上一层
shell.cd('..');
//同步执行git命令提交代码
if (shell.exec('git commit -am "Auto-commit"').code !== 0) {
shell.echo('Error: Git commit failed');
shell.exit(1);
}重要方法的语法:
1. exec()
1.1. 参数:
exec(command [, options] [, callback])command <String>:要在命令行执行的完整命令options <Object>:可选参数,JSON对象, 键值对:- async: 是否异步执行.
- 如果你提供了回调方法,这个值就一定为true,无论你怎么设置
- silent:打印信息是否不输出到命令控制台
- Node.js 的 child_process.exec()方法的其他参数都可以用
- async: 是否异步执行.
callback:<Function>:当进程终止时调用,并带上输出。error <Error>stdout <String> | <Buffer>stderr <String> | <Buffer>
1.2. 返回值:
同步模式下,将返回一个ShellString(shelljs v0.6.xf返回一个形如{ code:…, stdout:… , stderr:… }的对象);异步模式下,将返回一个child_process的对象
Note:
由于exec()现在同步方法的实现占用了大量CPU,所以,官方建议使用异步模式运行一个需要长时间保活的进程。
1.3. 例子:
var version = exec('node --version', {silent:true}).stdout;
var child = exec('some_long_running_process', {async:true});
child.stdout.on('data', function(data) {
/* ... do something with data ... */
});
exec('some_long_running_process', function(code, stdout, stderr) {
console.log('Exit code:', code);
console.log('Program output:', stdout);
console.log('Program stderr:', stderr);
});2. ls()
2.1. 语法之一
ls([options,] path_array)
2.2. 参数
options <String>:可选参数,可以多个参数叠加使用,比如-lA-R: 递归处理,将指定目录下的所有文件及子目录一并处理-A: 显示除影藏文件“.”和“..”以外的所有文件列表-L: 如果遇到性质为符号链接的文件或目录,直接列出该链接所指向的原始文件或目录-d: 仅显示目录名,而不显示目录下的内容列表。显示符号链接文件本身,而不显示其所指向的目录列表-l: 以长格式显示目录下的内容列表。输出的信息从左到右依次包括文件名,文件类型、权限模式、硬连接数、所有者、组、文件大小和文件的最后修改时间等
path_array <Array>:可选参数,目标目录的组成的数组,ls命令依次处理各个目录
2.2. 语法之一:
ls([options,] [path, ...])
参数
options <String>:可选参数,与ls([options,] path_array)方法的参数一样[path, ...]:可选参数,目标目录序列,以多参数的形式存在,
比如:ls ( path1, path2 , … , pathN);
2.3. 返回值
ls方法返回一个包含给定的目标目录下的所有文件或目录路径集合的数组,如果没有给定路径,则默认为当前路径。如果设置了上面的提到的参数,则按照给定参数逐条将结果保存在数组中。
2.4. 例子:
ls('projs/*.js');//
ls('-R', '/users/me', '/tmp');//递归遍历'/users/me'和'/tmp'
ls('-R', ['/users/me', '/tmp']); // 和上面一条一样
ls('-l', 'file.txt'); //[ { name: 'file.txt', mode: 33188, nlink: 1, ...} ]3. ShellString()
ShellString(str)str <String>:常规字符串ShellString()方法用于将常规字符串转换为ShellString。这样,就可以使用ShellString的方法to()和toEnd()。
4. ShellString.prototype.to(file)
类似Unix命令中的_重定向操作>_,即把ShellString的内容覆盖写入参数指定的file。
4.1. 例子:
//将input.txt的内容写入outpu.txt
cat('input.txt').to('output.txt');5. ShellString.prototype.toEnd(file)
类似Unix命令中的_重定向并附加操作>>_,即把ShellString的内容写到指定文件的末尾。
5.1. 例子:
//将input.txt的内容附加outpu.txt的末尾
cat('input.txt').to('output.txt');