使用ShellJS提高你的開發效率(一)

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

    • shell.which(command)

    在環境變量PATH中尋找指定命令的地址,判斷該命令是否可執行,返回該命令的絕對地址git

    • echo正則表達式

      在控制檯輸出指定內容
      .to(index.txt)寫入文件shell

    • exit(code)
      以退出碼爲code退出當前進程npm

    • rm([options,] file [,file ...])

      刪除一個目錄中一個或多個文件或目錄,一旦刪除,沒法恢復。

      經常使用參數:

      1. -f:強制刪除文件;
      2. -i:刪除以前先詢問用戶;
      3. -r:遞歸處理目錄;
      4. -v:顯示處理過程;
      shell.rm('-rf', staticSplash);
      複製代碼
    • cp([options,] source_array, dest) cp('-R','index.txt', '~/newCopy/') cp('-R',['index.txt', 'old.txt'], '~/newCopy/')

      用來將一個或多個源文件或目錄複製到指定的文件或目錄。

      經常使用參數:

      1. -f:force (default behavior)
      2. -L: follow symlinks
      3. -r,-R: recursive
      4. -n: no-clobber
      5. -u: only copy if source is newer than dest
      6. -P: don't follow symlinks
    • cd

      切換工做目錄至指定的相對路徑或絕對路徑。cd..爲返回上一級,cd-回到前一目錄。

    • ls

      用來顯示目標列表。

      經常使用參數:

      1. -a:顯示全部文件;
      2. -C:多列顯示查詢結果;
      3. -l:單列長格式顯示查詢結果(與-C相反);
      4. -R:遞歸處理目錄;
      5. -A:全部文件(包括開頭的文件.,除了.和..)
      6. -d:列出目錄自己,而不是其內容
      ls(path.join('bundle', 'css/')).forEach(cssName => {
        ***
      })
      複製代碼
    • sed([options,] search_regex, replacement, file_array

      將file_array中符合search_regex的內容替換爲replacement,支持正則的捕獲組自引用。一次處理一行內容,處理完成後把緩衝區內容送往屏幕,而後處理下一行,循環直至結束。

      經常使用參數:

      1. -i:直接做用源文件
    • cat([options,] file [, file ...])

      將一個或多個文件內容讀入,指定一個文件時讀入該文件,指定多個文件時將內容鏈接在一塊兒讀入。

      可用選項:
      -n: number all output lines

    • exec(command [, options] [, callback])

      執行所傳入的命令

      1. async:是否異步執行,默認false,傳入callback時自動開啓
      2. slient:不輸出信息到console,默認false
      3. encoding:默認utf8
        ex
        除非另有說明,不然command 同步執行給定的給定。在同步 模式下,它返回一個ShellString(與ShellJS v0.6.x兼容,返回 表單的對象{ code:..., stdout:... , stderr:... })。不然,這將返回子進程 對象,並callback獲取參數(code, stdout, stderr)。
        注意:對於長期存在的進程,最好以exec()異步方式運行
    • chmod

      設置文件調用權限

      1. -c:output a diagnostic for every file processed
      2. -v: like verbose, but report only when a change is made
      3. -R: change files and directories recursively

      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:在向堆棧添加目錄時禁止正常更改目錄,以便僅操做堆棧

      參數

      1. dir:使當前工做目錄成爲堆棧的頂部,而後執行等效的cd dir
      2. +N:經過旋轉堆棧將第N個目錄(從dirs打印的列表的左側開始,從零開始)到列表的頂部
      3. -N:經過旋轉堆棧將第N個目錄(從dirs打印的列表右側開始,從零開始計數)到列表頂部
      echo(process.cwd());  // 當前文件父路徑 /Users...
      pushd('/etc') // /private/etc /Users...
      pushd('+1') // users... /private/etc  
      複製代碼

      將當前目錄保存在目錄堆棧的頂部,而後cd到dir。沒有參數,pushd交換前兩個目錄。返回堆棧中的路徑數組。

    • popd([options,] [' - N'|'+ N'])

      可用選項:
      -n:從堆棧中刪除目錄時禁止正常更改目錄,以便僅操做堆棧

      參數:

      1. +N:刪除第N個目錄(從dirs打印的列表左側開始計算),從零開始
      2. -N:刪除第N個目錄(從dirs打印的列表右側開始計算),從零開始。
      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:經過刪除全部元素清除目錄堆棧

      參數:

      1. +N:顯示第N個目錄(從沒有選項調用時由dirs打印的列表左側開始計數),從零開始
      2. -N:顯示第N個目錄(從沒有選項調用時由dirs打印的列表右側開始計數),從零開始

      顯示當前記住的目錄列表。返回堆棧中的路徑數組,若是指定了+ N或-N,則返回單個路徑。

    • find(path [,path ...])

      查找文件

      console.log(find('../Config/application.js'))
      複製代碼

      返回path_array

    • grep([options,] regex_filter,file [,file ...])

      不一樣於fing查找文件,grep用於查找內容

      可用選項:

      1. -v:反轉正則表達式的意義並打印不符合條件的行
      2. -l:僅打印匹配文件的文件名
      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建立文件

      可用選項:

      1. -a:僅更改訪問時間
      2. -c:不要建立任何文件
      3. -m:僅更改修改時間
      4. -d DATE:指定時間
      5. -r FILE:用FILE的時間替代新文件時間
    • mv([options,] source [,source ...],dest')

      移動

      可用選項:

      1. -f:force(默認行爲)
      2. -n:no-clobber
      mv('move', 'target');  // 將move文件移動到target文件夾
      複製代碼
    • PWD()

      查看當前目錄

    • set(選項)

      設置全局配置變量

      可用選項:

      1. +/-e:出錯時退出(config.fatal)
      2. +/-v:verbose:show all commands(config.verbose)
      3. +/-f:禁用文件名擴展(globbing)
      set('-e'); // exit upon first error
      set('+e'); // this undoes a "set('-e')"
      複製代碼
    • sort([options,] file [,file ...])

      內容排序

      可用選項:

      1. -r:反轉比較結果
      2. -n:根據數值比較
      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]])

      可用選項:

      1. -i:比較時忽略大小寫
      2. -c:按出現次數排列前綴
      3. -d:僅打印重複的行,每行對應一行
    • 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

      1. config.silent sh.config.silent
      2. config.fatal config.fatal
      3. config.verbose config.verbose
      4. config.globOptions config.globOptions
      5. config.reset()重置全局 shell.config.reset()
參考連接

shelljs官網文檔

相關文章
相關標籤/搜索