shell脚本是一个命令语言,面向的是操作系统执行。如果写过shell脚本的话,应该体会过编写过程的痛苦。因为shell并不是一个编程语言,并不支持常见的数组,JSON等数据结构,也不支持面向对象编程的开发方法,因此对开发人员很不友好。
目前针对这种情况,大家一般会用shell调用node执行JS脚本,真正的处理逻辑放在JS脚本中处理。现在谷歌推出了 ZX NPM包,它能够用JS编写shell脚本。
那如何使用呢?
npm install -g zx
安装完后,在终端中输入 zx 命令检查安装是否成功。
新建zx脚本文件:test.mjs
#!/usr/bin/env zx
const branch = await $`git branch --show-current`
console.log(`Current branch: ${branch}`)
第一行是指定脚本的执行器。
$ 是内置的函数,能够执行命令并配合 await 返回执行结果。其他的写法都和JS毫无差别。
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地址。