一文聊聊在Nodejs中怎麼用 zx庫 編寫 Shell 指令碼

2022-01-19 22:00:23
Node中如何編寫Shell指令碼?下面本篇文章給大家介紹一下使用zx庫在中編寫Shell指令碼的方法,希望對大家有所幫助!

Shell 指令碼

建立一個 shell 指令碼,即一個由 shell 執行的指令碼,比如 Bash 或 zsh,是用來實現自動化重複任務的常見方法,特別是對於運維人員最熟悉了。對於前端工程師來說使用 Node.js 編寫 shell 指令碼是個不錯的選擇,因為它提供了許多核心模組,並可以匯入前端其他的指令碼庫,降低學習成本。

如果不借助 zx.js 想嘗試編寫一個在 Node.js 下執行的 shell 指令碼,可能會發現它並不像希望的那樣流暢。需要為子程序編寫特殊處理,注意跳脫命令列引數,然後使用標準輸出 stdout 和標準錯誤 stderr,它不是特別直觀,並且使用 shell 指令碼編寫變得非常笨拙。

Bash shell 指令碼語言是編寫 shell 指令碼的最佳選擇,不需要編寫程式碼來處理子程序,並且它具有用於處理 stdoutstderr 的內建語言特性。但是用Bash編寫 shell 指令碼也不是那麼容易,語法可能相當混亂,使得實現邏輯或處理提示使用者輸入之類的事情變得不那麼方便。

Google 的 zx.js 庫有助於使用 高效且愉快地編寫 shell 指令碼。

官方網站:https://github.com/google/zx#-zx

安裝

對於前端工程師來說,安裝一個依賴是家常便飯,執行以下指令碼:

npm install zx

使用

Google 的 zx.js 提供了封裝子程序的建立以及從這些程序處理 stdoutstderr 的函數。下面將使用的主要函數是 $ 函數,使用 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

1.png

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 提供的實用功能外,它還提供了幾個流行的指令碼庫,例如:

  • chalk:允許為指令碼的輸出新增顏色。
  • minimist:解析命令列引數的庫,將它們暴露在 argv 物件下。
  • fetch:可以使用它來發出 HTTP 請求。
  • fs-extra:公開了 Node.js 核心 fs 模組,以及許多其他方法,可以更輕鬆地使用檔案系統。

更多node相關知識,請存取:!!

以上就是一文聊聊在Nodejs中怎麼用 zx庫 編寫 Shell 指令碼的詳細內容,更多請關注TW511.COM其它相關文章!