|
|
|
|
公众号矩阵

几天狂增 1.1 万 Star!谷歌这个脚本工具必须推荐一波

这是一个更方便、更友好帮助开发者写脚本的工具。有 Google “爸爸”的光环加持,该工具短短几天在 GitHub 上就破万 Star 了。

作者:小秋来源:开源前哨|2021-05-13 10:20

 

zx 是一个更方便、更友好帮助开发者写脚本的工具。有 Google “爸爸”的光环加持,该工具短短几天在 GitHub 上就破万 Star 了。

简介

Bash 很好,但是在编写脚本的时候,人们通常会选择一种更方便的编程语言,JavaScript 就是一个很完美的选择。但是标准的 Node.js 库在使用之前需要许多额外的操作,比如安装、引入库等,zx 提供一个包装器 child_process,用于转义参数并提供合并的默认值。

  1. #!/usr/bin/env zx 
  2.  
  3. await $`cat package.json | grep name` 
  4.  
  5. let branch = await $`git branch --show-current` 
  6.  
  7. await $`dep deploy --branch=${branch}` 
  8.  
  9. await Promise.all([ 
  10.  
  11. $`sleep 1; echo 1`, 
  12.  
  13. $`sleep 2; echo 2`, 
  14.  
  15. $`sleep 3; echo 3`, 
  16.  
  17. ]) 
  18.  
  19. let name = 'foo bar' 
  20.  
  21. await $`mkdir /tmp/${name}` 

项目地址是:

https://github.com/google/zx

安装使用

安装

  1. npm i -g zx 

简单使用。将编写的脚本放在 .mjs 后缀的文件中,或者使用 .js 后缀,但是需要 void async function () {...}() 对脚本进行包装。

脚本需要包含以下文件头:

  1. #!/usr/bin/env zx 

运行脚本(需要先添加执行权限):

  1. chmod +x ./script.mjs 
  2.  
  3. ./script.mjs 
  4.  
  5. // 或者使用这个命令 
  6.  
  7. zx ./script.mjs 

常用命令

使用child_process包中提供的exec函数可以把字符串当做命令执行,并返回Promise<ProcessOutput>对象。

  1. let count = parseInt(await $`ls -1 | wc -l`) 
  2.  
  3. console.log(`Files count: ${count}`) 

例如,并行上传文件:

  1. let hosts = [...] 
  2.  
  3. await Promise.all(hosts.map(host => 
  4.  
  5. $`rsync -azP ./src ${host}:/var/www` 
  6.  
  7. )) 

如果执行脚本返回非0状态码,将会抛出ProcessOutput对象:

  1. try { 
  2.  
  3. await $`exit 1
  4.  
  5. catch (p) { 
  6.  
  7. console.log(`Exit code: ${p.exitCode}`) 
  8.  
  9. console.log(`Error: ${p.stderr}`) 
  10.  

抛出ProcessOutput对象结构如下:

  1. class ProcessOutput { 
  2.  
  3. readonly exitCode: number 
  4.  
  5. readonly stdout: string 
  6.  
  7. readonly stderr: string 
  8.  
  9. toString(): string 
  10.  

cd(),修改工作路径:

  1. cd('/tmp'
  2.  
  3. await $`pwd` // outputs /tmp 

fetch(),对node-fetch包的包装:

  1. let resp = await fetch('http://wttr.in'
  2.  
  3. if (resp.ok) { 
  4.  
  5. console.log(await resp.text()) 
  6.  

question(),对readline包的包装:

  1. type QuestionOptions = { choices: string[] } 
  2.  
  3. function question(query: string, options?: QuestionOptions): Promise<string> 

用法:

  1. let username = await question('What is your username? '
  2.  
  3. let token = await question('Choose env variable: ', { 
  4.  
  5. choices: Object.keys(process.env) 
  6.  
  7. }) 

chalk包,不需要导入就可以直接用

  1. console.log(chalk.blue('Hello world!')) 

fs包,需要导入就可以直接用

  1. let content = await fs.readFile('./package.json'

Promisified默认被引入了,相当于写了以下代码:

  1. import {promises as fs} from 'fs' 

os包,需要导入就可以直接用

  1. await $`cd ${os.homedir()} && mkdir example` 

zx可以从其他脚本导入:

  1. #!/usr/bin/env node 
  2.  
  3. import {$} from 'zx' 
  4.  
  5. await $`date` 

传递环境变量:

  1. process.env.FOO = 'bar' 
  2.  
  3. await $`echo $FOO` 

执行远程脚本:

  1. zx https://medv.io/example-script.mjs 

【编辑推荐】

  1. 留给散户的时间不多了?大规模采用使加密技术走向中心化
  2. 谷歌 Chrome 浏览器将获得全新“共享中心”,不用再眼馋微软 Edge 了
  3. 微软 Windows 10 免费工具集 PowerToys v0.37.2 发布:修复资源管理器崩溃问题
  4. 生物识别技术的安全挑战以及法律规范
  5. 64家科技巨头和芯片大厂,施压美国提供芯片补贴,苹果谷歌在列
【责任编辑:张燕妮 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢
24H热文
一周话题
本月获赞

订阅专栏+更多

数据湖与数据仓库的分析实践攻略

数据湖与数据仓库的分析实践攻略

助力现代化数据管理:数据湖与数据仓库的分析实践攻略
共3章 | 创世达人

8人订阅学习

云原生架构实践

云原生架构实践

新技术引领移动互联网进入急速赛道
共3章 | KaliArch

40人订阅学习

数据中心和VPDN网络建设案例

数据中心和VPDN网络建设案例

漫画+案例
共20章 | 捷哥CCIE

235人订阅学习

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微