shell很难写?快用JS写shell脚本吧

shell脚本是一个命令语言,面向的是操作系统执行 。如果写过shell脚本的话,应该体会过编写过程的痛苦 。因为shell并不是一个编程语言,并不支持常见的数组,JSON等数据结构,也不支持面向对象编程的开发方法,因此对开发人员很不友好 。
 
目前针对这种情况,大家一般会用shell调用node执行JS脚本,真正的处理逻辑放在JS脚本中处理 。现在谷歌推出了 ZX NPM包,它能够用JS编写shell脚本 。
 
那如何使用呢?
 
1.全局安装zx【shell很难写?快用JS写shell脚本吧】npm install -g zx安装完后,在终端中输入 zx 命令检查安装是否成功 。

shell很难写?快用JS写shell脚本吧

文章插图
 
2.创建一个简单的脚本新建zx脚本文件:test.mjs
#!/usr/bin/env zxconst 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地址 。




    推荐阅读