shell腳本是一個命令語言,面向的是操作系統執行。如果寫過shell腳本的話,應該體會過編寫過程的痛苦。因為shell并不是一個編程語言,并不支持常見的數組,JSON等數據結構,也不支持面向對象編程的開發方法,因此對開發人員很不友好。
目前針對這種情況,大家一般會用shell調用node執行JS腳本,真正的處理邏輯放在JS腳本中處理。現在谷歌推出了 ZX NPM包,它能夠用JS編寫shell腳本。
那如何使用呢?
1.全局安裝zx
npm install -g zx
安裝完后,在終端中輸入 zx 命令檢查安裝是否成功。

2.創建一個簡單的腳本
新建zx腳本文件:test.mjs
#!/usr/bin/env zx
const branch = await $`git branch --show-current`
console.log(`Current branch: ${branch}`)
第一行是指定腳本的執行器。
$ 是內置的函數,能夠執行命令并配合 await 返回執行結果。其他的寫法都和JS毫無差別。
3.執行腳本
zx ./test.mjs
或者:
chmod +x ./test.mjs
./test.mjs
控制臺就會輸出當前的分支。
上面只是小試牛刀,zx 的強大遠不止如此。由于 zx 在內部實現了 Bash 的解釋器,所以可以執行全部的shell命令。另外 zx 還內置很多nodejs模塊,比如 fs, os,fetch等。所以可以直接在腳本中使用這些模塊。
另外作為TS編寫的庫,全部的JS語法都能夠支持。包括但不限于 數組,Promise,class等。
下面再舉一個例子:
let resp = await fetch('http://wttr.in')
if (resp.ok) {
console.log(await resp.text())
}
let hosts = [...]
await Promise.all(hosts.map(host =>
$`rsync -azP ./src ${host}:/var/www`
))
try {
await $`exit 1`
} catch (p) {
console.log(`Exit code: ${p.exitCode}`)
console.log(`Error: ${p.stderr}`)
}
總結一下,zx 的最大優點是結合了Bash和JAVAScript,解決了shell腳本復雜邏輯編程的問題。同時也讓對shell不熟悉的開發者也能用JS完成shell腳本的開發,而且更加靈活高效。
如果你還有更多問題,可以參考NPM倉庫 zx 包的介紹,或者訪問其github地址。