zx是一个更方便友好的帮助开发者编写脚本的工具。在谷歌“爸爸”光环的加持下,该工具在短短几天内在GitHub上的Star数已突破10000。简介Bash很棒,但是在编写脚本时,人们通常会选择更方便的编程语言,而JavaScript是一个完美的选择。但是标准的Node.js库在使用前需要很多额外的操作,比如安装、导入库等,zx提供了一个包装器child_process来转义参数和提供合并的默认值。#!/usr/bin/envzxawait$`catpackage.json|grepname`letbranch=await$`gitbranch--show-current`await$`depdeploy--branch=${branch}`awaitPromise.all([$`sleep1;echo1`,$`sleep2;echo2`,$`sleep3;echo3`,])letname='foobar'await$`mkdir/tmp/${name}`项目地址为:https://github.com/google/通过安装npmi-gzx安装zx很简单。把写好的脚本放到一个.mjs后缀的文件里,或者用.js后缀,但是需要voidasyncfunction(){...}()来包装脚本。脚本需要包含如下文件头:#!/usr/bin/envzx运行脚本(需要先添加执行权限):chmod+x./script.mjs./script.mjs//或者使用这条命令zx./script.mjs常用命令使用child_process包中提供的exec函数将字符串作为命令执行,返回一个Promise对象。letcount=parseInt(await$`ls-1|wc-l`)console.log(`Filescount:${count}`)例如并行上传文件:lethosts=[...]awaitPromise.all(hosts.map(host=>$`rsync-azP./src${host}:/var/www`))如果执行脚本返回非零状态码,将抛出一个ProcessOutput对象:try{await$`exit1`}catch(p){console.log(`Exitcode:${p.exitCode}`)console.log(`Error:${p.stderr}`)}抛出ProcessOutput对象结构如下:classProcessOutput{readonlyexitCode:numberreadonlystdout:stringreadonlystderr:stringtoString():string}cd(),修改工作路径:cd('/tmp')await$`pwd`//outputs/tmpfetch(),包裹node-fetch包:letresp=awaitfetch('http://wttr.in')if(resp.ok){console.log(awaitresp.text())}question(),readline包的包:typeQuestionOptions={choices:string[]}functionquestion(query:string,options?:QuestionOptions):Promise用法:letusername=awaitquestion('Whatisyourusername?')lettoken=awaitquestion('Chooseenvvariable:',{choices:Object.keys(process.env)})chalk包,不用导入console.log(chalk.blue('Helloworld!'))fs包,直接使用letcontent=awaitfs.readFile('./package.json')Promisi如果你需要导入默认引入fied,相当于写如下代码:import{promisesasfs}from'fs'os包,可以直接使用await$`cd${os.homedir()}&&mkdirexample`zx从其他脚本导入:#!/usr/bin/envnodeimport{$}from'zx'await$`date`传递环境变量:process.env.FOO='bar'await$`echo$FOO`执行远程脚本:zxhttps://medv.io/示例脚本.mjs