JavaScript ZX——用JS写Shell脚本

Page content

ZX库简介

zx是Google推出的一个运行在Node.js环境下的方便开发人员编写命令行脚本程序的类库。

命令脚本程序是基于特定操作系统,方便完成的一系列批处理工作的脚本程序。在Unix-like的操作系统,通常是使用shell脚本。在Windows系统中使用的则是bat脚本。

这类批处理脚本都有一个共同的特点——语法晦涩不好编写。对于开发人员来说,掌握shell编程的收益并不大。好在Google推出了一款可以在Node运行时环境中进行shell编程的工具类库zx

zx的Github项目地址为https://github.com/google/zx,此项目在笔者写下这篇文章时就已经有23k左右的star了,可见这个库确实解决了开发人员的一个痛点。

ZX库的安装

安装ZX之前,需要确保本机具有Node的运行时环境。如果没有安装,可以去NodeJS官网下载,地址为:https://nodejs.org/en/

NodeJS的安装完毕后,你就可以使用npm(Node Package Manager)来安装zx了。

sudo npm install -g zx

使用ZX写一段shell脚本

zx提供了许多封装好的函数方便你进行shell编程。

例如:question函数,对readline进行了封装,可以更方便的接收shell的输入。同时zx还提供了fetch函数,可以更好的进行网络数据的请求。

在zx中以$符号开头的代表这是一个shell命令,它会立即执行并返回一个Promise,这个Promise被定义为

class ProcessPromise<T> extends Promise<T> {
  readonly stdin: Writable
  readonly stdout: Readable
  readonly stderr: Readable
  readonly exitCode: Promise<number>
  pipe(dest): ProcessPromise<T>
  kill(signal = 'SIGTERM'): Promise<void>
}

ProcessPromise的返回值为:

class ProcessOutput {
  readonly stdout: string
  readonly stderr: string
  readonly exitCode: number
  toString(): string
}

其中如果shell命令执行成功,那么exitCode字段将被设置为0。同时shell命令执行后的输出将会被保存在stdout中。如果执行失败,那么exitCode将为一个非零的整数,命令的输出将会被保存在stderr中。

同时你也可以对shell命令执行后的输出进行重定向:

$`git pull`.pipe(streamVar)

Demo:自动提交当前代码

#!/usr/bin/env zx

// 注意$返回的是一个Promise
let { exitCode } = await $"git add ."

if (exitCode != 0) {
	process.exit(-1)
}

let { exitCode } = await $"git commit -m \"update\""

if (exitCode != 0) {
	process.exit(-1)
}

写好脚本之后,脚本需要被zx执行,而不是node。

zx ./script.js

也可以在文件开头指明执行当前脚本的程序

#!/usr/bin/env zx

//script.js

然后给当前文件赋予可执行权限后,便可以单独运行此文件

chmod +x ./script.js

关于zx库的更多用法,可以在Github上进行查看https://github.com/google/zx