使用 JavaScript 編寫 Shell 腳本
大家好,我是 Peter。
作爲程序員,在平時的開發中肯定少不了一些命令行操作了。當然,簡單的命令大家都是可以拿捏的,但是涉及到一些邏輯的時候還是比較頭疼的。
Shell
Shell
是一個用 C
語言編寫的程序,它是用戶使用 Linux
的橋樑。它既是一種命令語言,又是一種程序設計語言。
Shell
腳本(shell script
),是一種爲 shell
編寫的腳本程序,一般文件後綴爲 .sh
。
Shell
編程跟 java、php
編程一樣,只要有一個能編寫代碼的文本編輯器和一個能解釋執行的腳本解釋器就可以了。
Shell
的解釋器種類衆多,常見的有:
-
sh
- 即Bourne Shell
。sh
是Unix
標準默認的shell
。 -
bash
- 即Bourne Again Shell
。bash
是Linux
標準默認的shell
。 -
fish
- 智能和用戶友好的命令行shell
。 -
xiki
- 使shell
控制檯更友好,更強大。 -
zsh
- 功能強大的 shell 與腳本語言。
一般在 shell
腳本的開頭,#!
告訴系統其後路徑所指定的程序即是解釋此腳本文件的 Shell
解釋器。#!
被稱作 shebang
。
所以,你應該會在 shell
中,見到諸如以下的註釋:
指定 sh
解釋器
#!/bin/sh
指定 bash
解釋器
#!/bin/bash
zx
當然,無論哪種解釋器,對前端程序員都不算友好,有一定的學習成本。
畢竟我們只是 “切圖仔”。
開個玩笑,因爲我們前端程序員的口號是:能用 JS
實現的絕對不用其他語言實現。
當然,我們也可以用 Node.js
執行一些簡單的 Shell
命令:
const { execSync } = require("child_process");
exec('git diff orgin/master', (err, data) => {
if (err) {
console.log("失敗", err);
process.exit(1);
} else {
console.log("成功", data);
}
});
但是這個體驗和直接寫 Shell
腳本相比就比較差了,我們需要手動用 child_process
進行包裝、每次引入一些額外的依賴庫、異常處理也比較麻煩、另外還要考慮轉譯命令行參數。
所以 Google
的前端程序員開源了基於 JavaScript
實現的 Shell
解釋器。zx
對 child_process
進行了默認包裝,對參數進行了轉譯而且提供了合理的默認值。可以很方便的讓我們使用前端熟悉的 JavaScript
語法來編寫 Shell
腳本:
#!/usr/bin/env zx
await $`cat package.json | grep name`
let branch = await $`git branch --show-current`
await $`dep deploy --branch=${branch}`
await Promise.all([
$`sleep 1; echo 1`,
$`sleep 2; echo 2`,
$`sleep 3; echo 3`,
])
let name = 'foo bar'
await $`mkdir /tmp/${name}`
使用
安裝(要求 Node.js
版本 >= 16.0.0
):
npm i -g zx
建議將腳本寫到 .mjs
的文件裏,這樣我們可以很方便的直接在頂層使用 await
,然後在文件開頭聲明下面的 shebang
:
#!/usr/bin/env zx
通過下面的方式運行腳本:
chmod +x ./script.mjs
./script.mjs
或者使用 zx 運行:
zx ./script.mjs
可以嘗試一下:
const list = await $`ls -a`;
console.log(list);
const name = await question('你的名字是啥? ')
console.log(`你的名字是:${name}`);
所有函數(
$、cd、fetch
等)都可以直接使用,無需任何導入。
它還內置了很多方便的處理函數:
-
$
command
:使用child_process
的spawn
來制定指定的命令,返回一個Promise
-
cd()
:進入其他目錄。(cd('/project')
) -
fetch()
:發起方洛請求 -
question()
:讀取用戶輸入,相當於readline
的封裝 -
sleep()
:等待一段時間,相當於setTimeout
的封裝 -
echo()
:大打印文本,也可以直接用console.log
更多使用可以參考官方文檔:https://github.com/google/zx
如果你想加入高質量前端交流羣,或者你有任何其他事情想和我交流也可以添加我的個人微信 CALASFxiaotan 。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/EaHd9ErsP9SphWk31e01zA