Shelljs - Unix shell commands for Node.jsjavascript
Shelljs是Node.js下的脚本语言解析器,具备丰富且强大的底层操做(Windows/Linux/OS X)权限。Shelljs本质就是基于node的一层命令封装插件,让前端开发者能够不依赖linux也不依赖相似于cmder的转换工具,而是直接在咱们最熟悉不过的javascript代码中编写shell命令实现功能。css
解决问题前端
shell脚本对于前端都不陌生,在package.json配置里你们已经使用了,以"build": "umi build && node zip.config.js"
为例,npm run build先会执行umi build后会执行zip.config.js的脚本,zip.config.js脚本作的事就是if无build文件夹,则生成build文件夹并借助easyzip进行压缩打包,else存在build文件夹,则生成zip压缩包或者其余公司须要的文件。
shelljs作的事就是自动化,从耗时的重复性常规动做里解放出来,提高开发效率和工做心情。java
基本语法node
//引入shelljs
var shell = require('shelljs')
//检查控制台是否以运行`git `开头的命令
if (!shell.which('git')) {
//在控制台输出内容
shell.echo('Sorry, this script requires git');
shell.exit(1);
}
shell.rm('-rf','out/Release');//强制递归删除`out/Release目录`
shell.cp('-R','stuff/','out/Release');//将`stuff/`中全部内容拷贝至`out/Release`目录
shell.cd('lib');//进入`lib`目录
//找出全部的扩展名为js的文件,并遍历进行操做
shell.ls('*.js').forEach(function (file) {
/* 这是第一个难点:sed流编辑器,建议专题学习,-i表示直接做用源文件 */
//将build_version字段替换为'v0.1.2'
shell.sed('-i', 'BUILD_VERSION', 'v0.1.2', file);
//将包含`REMOVE_THIS_LINE`字符串的行删除
shell.sed('-i', /^.*REMOVE_THIS_LINE.*$/, '', file);
//将包含`REPLACE_LINE_WITH_MACRO`字符串的行替换为`macro.js`中的内容
shell.sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, shell.cat('macro.js'), file);
});
//返回上一级目录
shell.cd('..');
//run external tool synchronously
//即同步运行外部工具
if (shell.exec('git commit -am "Auto-commit"').code !== 0){
shell.echo('Error: Git commit failed');
shell.exit(1);
}
复制代码
示例解释linux
在环境变量PATH中寻找指定命令的地址,判断该命令是否可执行,返回该命令的绝对地址git
echo正则表达式
在控制台输出指定内容
.to(index.txt)写入文件shell
exit(code)
以退出码为code退出当前进程npm
rm([options,] file [,file ...])
删除一个目录中一个或多个文件或目录,一旦删除,没法恢复。
经常使用参数:
shell.rm('-rf', staticSplash);
复制代码
cp([options,] source_array, dest) cp('-R','index.txt', '~/newCopy/') cp('-R',['index.txt', 'old.txt'], '~/newCopy/')
用来将一个或多个源文件或目录复制到指定的文件或目录。
经常使用参数:
cd
切换工做目录至指定的相对路径或绝对路径。cd..为返回上一级,cd-回到前一目录。
ls
用来显示目标列表。
经常使用参数:
ls(path.join('bundle', 'css/')).forEach(cssName => {
***
})
复制代码
sed([options,] search_regex, replacement, file_array
将file_array中符合search_regex的内容替换为replacement,支持正则的捕获组自引用。一次处理一行内容,处理完成后把缓冲区内容送往屏幕,而后处理下一行,循环直至结束。
经常使用参数:
cat([options,] file [, file ...])
将一个或多个文件内容读入,指定一个文件时读入该文件,指定多个文件时将内容链接在一块儿读入。
可用选项:
-n: number all output lines
exec(command [, options] [, callback])
执行所传入的命令
chmod
设置文件调用权限
u表示该文件拥有者,g表示同一群体者,o表示其余,a表示全部
+表示增长权限,-表示取消权限,=表示惟一设定权限
r表示可读,w表示可写,x表示可执行,X表示当该文件是个子目录
chmod(755, '/Users/brandon');
chmod('755', '/Users/brandon'); // same as above
chmod('u+x', '/Users/brandon');
chmod('-R', 'a-w', '/Users/brandon');
复制代码
pushd([options,] [dir |'-N'|'+ N'])
可用选项
-n:在向堆栈添加目录时禁止正常更改目录,以便仅操做堆栈
参数
echo(process.cwd()); // 当前文件父路径 /Users...
pushd('/etc') // /private/etc /Users...
pushd('+1') // users... /private/etc
复制代码
将当前目录保存在目录堆栈的顶部,而后cd到dir。没有参数,pushd交换前两个目录。返回堆栈中的路径数组。
popd([options,] [' - N'|'+ N'])
可用选项:
-n:从堆栈中删除目录时禁止正常更改目录,以便仅操做堆栈
参数:
echo(process.cwd()); // '/usr'
pushd('/etc'); // '/etc /usr'
echo(process.cwd()); // '/etc'
popd(); // '/usr'
echo(process.cwd()); // '/usr'
复制代码
若是没有给出参数,popd将从堆栈中删除顶级目录并执行cd到新的顶级目录。从dirs列出的第一个目录开始,元素从0开始编号; 即,popd至关于popd +0。返回堆栈中的路径数组
dirs([options |'+ N'|'-N']
可用选项:
-c:经过删除全部元素清除目录堆栈
参数:
显示当前记住的目录列表。返回堆栈中的路径数组,若是指定了+ N或-N,则返回单个路径。
find(path [,path ...])
查找文件
console.log(find('../Config/application.js'))
复制代码
返回path_array
grep([options,] regex_filter,file [,file ...])
不一样于fing查找文件,grep用于查找内容
可用选项:
grep('-v', 'GLOBAL_VARIABLE', '*.js');
grep('GLOBAL_VARIABLE', '*.js');
复制代码
从给定文件中读取输入字符串,并返回一个字符串,其中包含 与给定文件匹配的文件的全部行regex_filter
head([{' - n':},] file [,file ...])
读取文件的开头
可用选项:
-n :显示文件的第一行
console.log(head('bundle.js'))
console.log(head({'-n':1},'bundle.js')) // 获取第一行
复制代码
tail([{' - n':},] file [,file ...])
读取文件的结尾
可用选项: -n :显示文件的最后几行
var str = tail({'-n': 1}, 'file*.txt');
var str = tail('file1', 'file2');
var str = tail(['file1', 'file2']); // same as above
复制代码
ln([options,] source,dest)
建立连接
ln('file', 'newlink'); // /Users.../newlink
ln('-sf', 'file', 'newlink'); //若是newlink存在,则强制连接🔗
复制代码
mkdir([options,] dir [,dir ...])
建立文件夹
可用选项:
-p:完整路径(若有必要,将建立中间目录
shell.mkdir('bundle')
shell.mkdir('-p', ['bundle', 'js'])
复制代码
touch([options,] file [,file ...])
不一样于mkdir建立文件夹,touch建立文件
可用选项:
mv([options,] source [,source ...],dest')
移动
可用选项:
mv('move', 'target'); // 将move文件移动到target文件夹
复制代码
PWD()
查看当前目录
set(选项)
设置全局配置变量
可用选项:
set('-e'); // exit upon first error
set('+e'); // this undoes a "set('-e')"
复制代码
sort([options,] file [,file ...])
内容排序
可用选项:
sort('foo.txt', 'bar.txt');
sort('-r', 'foo.txt');
复制代码
返回文件的内容,逐行排序。排序多个
test()
文件类型判断
可用选项:
'-b', 'path':若是path是块设备,则为true
'-c', 'path':若是path是字符设备,则为true
'-d', 'path':若是path是目录,则为true
'-e', 'path':若是路径存在,则为true
'-f', 'path':若是path是常规文件,则为true
'-L', 'path':若是path是符号连接,则为true
'-p', 'path':若是path是管道(FIFO),则为true
'-S', 'path':若是path是套接字,则为true
if (!test('-f', path)) continue;
复制代码
uniq([options,] [input,[output]])
可用选项:
ShellString()
构造器,将一个字符串转化为Shell字符串,转化后的字符串支持链式调用特殊的shell命令
ShellString('hello world')
复制代码
ShellString.Prototype.to()
将shellString输出至指定文件,至关于脚本语言中的>
ShellString.Prototype.toEnd()
将shellString追加至指定文件,至关于脚本语言中的>>
env['VAR_NAME']
指向process.env
Pipes链式调用支持
sed,grep,cat,exec,to,toEnd均支持链式调用
Configuration
sh.config.silent
config.fatal
config.verbose
config.globOptions
shell.config.reset()