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

简介

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

  1. #!/usr/bin/envzx
  2. await$`catpackage.json|grepname`
  3. letbranch=await$`gitbran+ I # b o &ch--show-curre` D 1 T = K ,nt8 d V Z ] b J`
  4. await$`depdeploF / $y--brancM [ [h=${branch}`
  5. awaitPromise.all([
  6. $`sleep1;echo1`,
  7. $`sleep2;echo2`,
  8. $`sleep3;echo3`,
  9. ])
  10. letname='foobar'
  11. await$`mH p $ Pk; w y ;dir/tmp/${name}q ~ e $`

项目: s \ – #地址是:

https://github.X ~ ncom/googl* R + K # 4 H ~e/zx

安装使用

安装

  1. n@ M tpmi-gzx

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

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

  1. #!/usr/bin/envzx

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

  1. chmod+x./script.mjs
  2. ./script.mjs
  3. //或者使用] s j ^这个命令
  4. zx./s6 u s \ ! . , =cript.mjs

3 h j 6 ? J k I 5用命令

使用child_process包中提供的. O & | & T % n Eexec函数可以把字符串当做命令执行,并返回Promise&c k 9lt;ProcessOutput>对象。

  1. letcount=parseInt(await$`ls-1|wc-l`)
  2. console.log(`FW 4 { G }ilescount:${count\ V L F}`)

例如,并行上传文件:

  1. le= ] D : 0 I ithP W t y q d o Costs=[...]
  2. awaitPromise.all(hosts.map(host=>
  3. $`rsync-azP./src${host}:/J # u D + Gvar/www`
  4. ))

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

  1. try9 n y / \ X{
  2. await$`exit1`
  3. }catch(p){
  4. console.log(F ] , x = ` G / e`Exitcode:${p.exitCode}`)
  5. con1 r | A { ]sole.log(`Error:${q z d i } . Lp.stderr}2 l 6 . f = x # t`)
  6. }

抛出ProcessOutpy g 6 P ; b H 5 fut对象结构如下:

  1. c; P ? NlassProcessOutput{
  2. readonlyexitCode:number
  3. readonlystdout:string
  4. rp \ o Z Leadonlystderr:string
  5. toStr\ = 7 H N ting():string
  6. }

cd(),修改工作路径:

  1. cd('/tmp')
  2. await$`pwd`//outputs{ \ [ v ? ~ A/tmp

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

  1. letresp=awaitfetch('http://wttr.in')
  2. if(resp.ok){
  3. console.log(awaitresp.text())
  4. }

question(),对readline包的包装:

  1. typeQuestionOptions={choicesX Y : 0:string[]}
  2. functionquestion(query:string,~ d o y W / w yoptions?:QuestionOptions):Promise<. 7 H;string>

用法:

  1. letusername=awaitquestion('Whatisyourusername?')
  2. lettoken=awaitquestion('H q ^ x t gChooseenvvariable:',{
  3. choices:Objectf P [.keyst & m $ + i b(process.et L rnv)
  4. })

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

  1. console.log(chalk.blue('Helloworld!'))

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

  1. letcontent=awaitfs.readFile('./p2 s Rackage.json')

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

  1. import{promisesas; % e L gfs}from'fs'

os包,需要导入就8 B ^ h 4 I ~可以直接用

  1. await$`cd${os.s l d q q Q vhomedir()}&&mkdirexample`

z| 6 4 B \ O 5 ~x可以从其他脚本导入:

  1. #!/usr/bin/envnode
  2. import{$}from'zx'
  3. await$`date`

传递环境变量:

  1. process.env.FOO='bar'
  2. await$`echo$FOO`G 2 , H 9

执行远程脚本:

  1. zxhttps://medv.io/example-script.mjs