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()