前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >工具库 zx - 使用 JavaScript 更便捷地编写 shell 脚本

工具库 zx - 使用 JavaScript 更便捷地编写 shell 脚本

作者头像
Shiroka
发布2022-04-28 15:36:36
7910
发布2022-04-28 15:36:36
举报
文章被收录于专栏:pwpw

在编写一些复杂脚本做处理的时候,比起传统 shell 脚本,由于对 JS 更加熟悉,我更倾向于使用 JS 来编写。但一旦涉及到文件相关操作,几条 shell 指令肯定是更加方便的,但 Node 本身的 child_process 又差了那么点意思,手感并不是很好。

今年初发布的 zx 包于近日更新了 2.0 版本,它本质上是一个对原生 child_process 的包裹,提供了对传参等操作和部分默认行为的优化。同时它还是基于 Promise 的,因此可以随心所欲的在异步函数中使用。

作为一个常规的 npm 包,安装部分不再多说了,Node 肯定是需要的,直接进入使用部分。

基本使用

首先创建一个可运行的 zx 脚本:

代码语言:javascript
复制
echo '#!/usr/bin/env zx \n console.log("Hello, zx")' >> script.mjs
chmod +x script.mjs

指定运行环境为 zx 后,我们就可以像普通 shell 脚本一样直接运行 zx 脚本了。

执行 shell 指令

当需要执行 shell 指令时,使用 $ 符号和模板字符串对其进行包裹即可,其内部使用了 child_processspawn,返回值类型为 ProcessPromise<ProcessOutput>

例如,尝试创建删除文件并显示目录内文件个数:

代码语言:javascript
复制
await $`echo '' >> ~/abc`;
let count = parseInt(await $`ls -1 ~ | wc -l`);
console.log(`Files: ${count}`);
await $`rm ~/abc`;
count = parseInt(await $`ls -1 ~ | wc -l`);
console.log(`Files: ${count}`);

又或者是在一些录播脚本中并发上传文件:

代码语言:javascript
复制
const HOST = '1.1.1.1:3000';
let files = ['a.mp4', 'b.mp4'];
let target = '/home/ubuntu/rsync';
await Promise.all(files.map((filename) => $`rsync -azP ./${filename} ${HOST}:${target}`));

同时,zx 也支持错误处理:

代码语言:javascript
复制
try {
  await $`exit 1`;
} catch (p) {
  console.log(`Exit code: ${p.exitCode}`);
  console.log(`Error: ${p.stderr}`);
}

内置函数和工具库

除此之外 zx 还对一些常用指令和工具库进行了包裹以方便使用:

代码语言:javascript
复制
// shell cd
cd('/tmp');

// node-fetch 包
const res = await fetch('https://wttr.in');
if (res.ok) {
  console.log(await res.text());
}

// readline 包
const env = await question('Choose a env: ', {
  choices: Object.keys(process.env),
});

// setTimeout 实现的 sleep
await sleep(1000);

// 彩色输出 chalk
console.log(chalk.blue('This is blue'));

// fs-extra
const content = await fs.readFile('package.json');

额外的 Polyfill

zx 为 esm 脚本添加了一些额外的 polyfill 以方便使用:

代码语言:javascript
复制
// __filename 和 __dirname
console.log(__filename, __dirname);
// require
const { version } = require('package.json');
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本使用
  • 执行 shell 指令
  • 内置函数和工具库
  • 额外的 Polyfill
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档