Shell 指令碼
建立一個 shell 指令碼,即一個由 shell 執行的指令碼,比如 Bash 或 zsh,是用來實現自動化重複任務的常見方法,特別是對於運維人員最熟悉了。對於前端工程師來說使用 Node.js 編寫 shell 指令碼是個不錯的選擇,因為它提供了許多核心模組,並可以匯入前端其他的指令碼庫,降低學習成本。
如果不借助 zx.js
想嘗試編寫一個在 Node.js 下執行的 shell 指令碼,可能會發現它並不像希望的那樣流暢。需要為子程序編寫特殊處理,注意跳脫命令列引數,然後使用標準輸出 stdout
和標準錯誤 stderr
,它不是特別直觀,並且使用 shell 指令碼編寫變得非常笨拙。
Bash shell 指令碼語言是編寫 shell
指令碼的最佳選擇,不需要編寫程式碼來處理子程序,並且它具有用於處理 stdout
和 stderr
的內建語言特性。但是用Bash編寫 shell
指令碼也不是那麼容易,語法可能相當混亂,使得實現邏輯或處理提示使用者輸入之類的事情變得不那麼方便。
Google 的 zx.js
庫有助於使用 高效且愉快地編寫 shell
指令碼。
官方網站:https://github.com/google/zx#-zx
安裝
對於前端工程師來說,安裝一個依賴是家常便飯,執行以下指令碼:
npm install zx
使用
Google 的 zx.js
提供了封裝子程序的建立以及從這些程序處理 stdout
和 stderr
的函數。下面將使用的主要函數是 $
函數,使用 zx.js
規定指令碼寫入擴充套件名為 .mjs
的檔案中,以便能夠在頂層使用 await
。如果習慣於 .js
擴充套件名,請將指令碼包裝在類似 void async function () {...}()
中。
下面先來使用擴充套件名 .mjs
,每個 .mjs
檔案都將以下程式碼作為開頭:
#! /usr/bin/env node
下面就來實現一個 shell
指令碼中 ls
的功能,建立檔案 ls.mjs
,完整程式碼如下:
#! /usr/bin/env node import { $ } from "zx"; $.verbose = false; const output = (await $`ls`).stdout.trim(); console.log(output);
和 shell
指令碼檔案一樣,需要將其轉為可執行檔案:
chmod +x ./ls.mjs
下面就來執行這個 Node.js 編寫的 shell
指令碼,執行:
./ls.mjs
Google 的 zx.js
還提供了其他實用函數來簡化 shell 指令碼編寫,例如:
cd()
:允許更改當前的工作目錄question()
:Node.js 的 readline 模組的包裝器,可以直接提示使用者輸入。
#! /usr/bin/env node import { $, cd } from "zx"; $.verbose = false; // 預設為true,以詳細模式執行 const output = (await $`ls`).stdout.trim(); console.log(output); const dirName = "zx-mkdir-tmp"; await $`mkdir ${dirName}`; // 建立目錄 cd(`./${dirName}`); const pwdOutput = (await $`pwd`).stdout.trim(); console.log(pwdOutput); // zx-mkdir-tmp
除了 zx.js
提供的實用功能外,它還提供了幾個流行的指令碼庫,例如:
argv
物件下。fs
模組,以及許多其他方法,可以更輕鬆地使用檔案系統。更多node相關知識,請存取:!!
以上就是一文聊聊在Nodejs中怎麼用 zx庫 編寫 Shell 指令碼的詳細內容,更多請關注TW511.COM其它相關文章!