1个月增长15000 star,zx 库写shell脚本真不错~

news/2025/3/23 12:39:40/

大家好,我是若川。持续组织了5个月源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。

今天来讨论一个牛逼的项目 ——zx ,1个月增长15000 star, 成为了2021年度明星项目排行榜第一。

490014fbc210de3de288721498c35d2f.png

c7628bb472fd664ebb21ad91b0d1e608.png

zx 到底是什么呢?

我们可以从官网的介绍看到,一个能更方便地写脚本的工具。(A tool for writing better scripts)

Bash is great, but when it comes to writing scripts, people usually choose a more convenient programming language. JavaScript is a perfect choice, but standard Node.js library requires additional hassle before using. The zx package provides useful wrappers around child_process, escapes arguments and gives sensible defaults.

翻译:

Bash 用来写脚本非常棒,但是大家通常还是会去选择一种更方便方式去编写脚本,例如使用像 JavaScript 这种编程语言。但是 Node.js 在使用之前需要很多额外的操作,比如装包、引库等。但是zx 提供更多便捷的功能并且还对 child_process 进行了简化封装,从而能够直接调用一些命令。

通过阅读摘要和描述,我们可以知道虽然 Bash 很棒,但是没有 Node.js 简单。虽然 Node.js 编写起来简单,但是在使用前还是有一些麻烦的操作。而zx 没有以上两种方式的缺点,能够化繁为简,提供简单又方便操作。

在继续深入了解 zx 前,我们先来屡清楚目前提到的一些概念,了解这些概念有助于我们更好地去写脚本。

Shell、Shell脚本、Bash、zx、Node

首先来说说什么是Shell,Shell的中文意思是贝壳,是指与操作内核连接的外壳。

a98e2df671d2b307fbfe649bf5a9a129.png

狭义的Shell指的是命令行方面的软件,大多指Bash(Bash全称为 Bourne Again SHell ,是linux标准的默认Shell,它基于Bourne Shell,吸收了C Shell和Korn Shell );广义的Shell则包括图形界面。

因此 Shell 是一个大概念,包含了 Bash 等这些命令行工具,而利用这些工具写的脚本叫做Shell 脚本;而 Node 属于编程语言,可以编写 js 文件来执行一些命令, zx 是基于 Node 开发的工具,因此也能通过编写脚本来执行命令。

他们之间的关系我用一张图进行了描述,标题的概念用红色字样进行了加重。

251690c6ae2820cd3c4c281e7398021b.png

脚本可以做那些事情?

最为简单的就是重复的事情、处理数据格式,数据导入导出以及各种简单常用小工具的制作,环境配置等等。

举一些具体的例子就是:

下载视频

https://www.jianshu.com/p/0a013fa5a250

a82bed65fb8478af40cacdb635f61853.png

下载音乐

a1b27c8eccdb6fef84cfb63f1e0caa72.png

https://binaryify.github.io/NeteaseCloudMusicApi/#/

统计字数

7356843d1137f4f963cf6cf525c442b9.png

https://geek-docs.com/shell/shell-examples/the-shell-counts-the-number-of-lines-words-and-characters-in-the-file.html

自动签到

f8c83f74f9a7bfea27008e852dfc492e.png

https://github.com/RWoxiN/Qiandao

...

功能太多了列举不过来,反正你会的操作能帮你简化,你不会的操作能帮你实现。

哪些人可以使用?

脚本不仅仅可以帮助开发人员还能帮助非开发人员

例如很多人都喜欢在个人博客上面写文章,这时就可以用WordPress 快速搭建一个博客,然后我们就用脚本一键来安装WordPress,下面以 Shell 脚本为例:

d23ec6633436d82c1ab081ee98761959.png

https://gist.github.com/dessibelle/2666478

zx、Node、Shell(Bash) 功能评测

上面聊了脚本的一些概念以及脚本能帮助我们做什么。那么既然脚本这么强大,且脚本种类也非常多,为什么 zx 一经推出就这么收欢迎呢?

我们就以实际的功能为例来体验一下,分别使用了zx、Node、Shell(Bash,以下都称作Bash )三种脚本写一个批量压缩音视频的脚本

实现一个音频功能主要分成四个步骤

1.遍历当前目录

2.判断当前文件类型

3.执行压缩音频视脚本

首先我们先来看遍历当前目录三种脚本的写法:

Bash

#!bin/bash
for file in `(ls)`;
do...
done

Node

import fs from 'fs';const dirs = fs.readdirSync('./'));
for (let i in dirs) {... 
}

zx

const dirs = (await $`ls`).stdout.split('\n')for (let i in dirs) {...
}

可以看到 Bash 和 zx 差不多,但是 zx 比Node 省去了引包的代码。

优势:zx = Bash > Node

其次我们再来看判断当前文件类型三种脚本的写法:

Bash

if test -f $file
thenfilename=$(basename $file);if [ "${file##*.}"x = "mp4"x ];thenfiif [ "${file##*.}"x = "mp3"x ]; thenfi
fi

Node、zx

if (dirs[i] && !fs.statSync(source).isDirectory()) { if (source.endsWith(".mp4")) {}if (source.endsWith(".mp3")) {}
}

用Shell 来写整体上代码都非常的精炼,但是对于不经常使用的人来说,常常会遇到一些问题,例如 if 语句格式非常严格、判断比较的方式比较特殊、字符串操作都比较麻烦。

优势 Node = zx > Bash

最后再来执行压缩音频视脚本

Bash

...
ffmpeg -i $file -r 30 -c copy -c:v libx264 -vf scale=720:-2 "${filename%%.*}-30-720".mp4;
...

Node

const { spawn } = require('child_process');function run(command) {return new Promise((rev, rej) => {console.log(command);const cmd = spawn(command.slice(0, 1)[0], command.slice(1));cmd.stdout.on('data', (data) => {console.log(`stdout: ${data}`);});cmd.stderr.on('data', (data) => {console.error(`stderr: ${data}`);});cmd.on('close', (code) => {console.log(`child process exited with code ${code}`);rev();});})
}...
await run(["ffmpeg", "-i", source ,"-r","30","-c", "copy","-c:v", "libx264",  "-vf", "scale=720:-2", `${dirs[i].replace('.mp4', '')}-30-720.mp4`]);
...

zx

$`ffmpeg -i ${file} -r 30 -c copy -c:v libx264 -vf scale=720:-2 ${file.replace(".mp4","")}-30-720.mp4;`;

用 zx 可以做到和 Shell 一样的精简,利用内置的一些 Node 包使得整体的代码量大大下降。Node需要写一些额外的代码,例如执行命令run等等。

优势 Bash = zx > Node


上手程度代码复杂度
Shell简洁
Node简单繁琐
zx简单简洁

zx 上手体验非常好,可以说用四个字来概括, “简洁易用”,至此你是否对 zx 心动了呢?

a4c97ac587b2131273ab0aca48f1c791.gif

················· 若川简介 ·················

你好,我是若川,毕业于江西高校。现在是一名前端开发“工程师”。写有《学习源码整体架构系列》20余篇,在知乎、掘金收获超百万阅读。
从2014年起,每年都会写一篇年度总结,已经写了7篇,点击查看年度总结。
同时,最近组织了源码共读活动,帮助3000+前端人学会看源码。公众号愿景:帮助5年内前端人走向前列。

ce1a68ca5806f2a8ab35e479c1f4a4c5.png

识别方二维码加我微信、拉你进源码共读

今日话题

略。分享、收藏、点赞、在看我的文章就是对我最大的支持~

文章来源:https://blog.csdn.net/u012384510/article/details/122613096
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/news/551526.html

相关文章

ZXCZXCZX

ZXCZXCZXCZXCZXCZX

谷歌Zxing Utils

关于Zxing 生成地二维码去除白边, 设置的MARGIN 当成像素空白而不是按照比例 Zxing 去除多余的白边 import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.Writer; import com.google.zxing.WriterException; import co…

zx-calendar JS日历插件(带Vue2/Vue3/React版本)

zx-calendar, zx-vue-calendar (Vue2.x.x and Vue3.x.x), zx-react-calendar 源码文档地址:https://github.com/capricorncd/calendar 演示地址 https://capricorncd.github.io/calendar/dist/index.html Vue docs and example Vue 2.x.x https://capricorncd.g…

ZX手机平台的几个问题

转载时请注明出处和作者联系方式作者联系方式&#xff1a;李先静 <xianjimli at hotmail dot com> 花近一个月时间的研究&#xff0c;对ZX的手机开发平台有了大体上了解&#xff0c;总的说来&#xff0c;代码质量还算不错&#xff0c;可读性非常好。但其中有几点&#x…

移动端HTML富文本编辑器zx-editor的扩展实现,适用于APICloud、DCloud、蓝鸟(BlueBird)、hybrid等混合APP开发

移动端HTML文档&#xff08;富文本&#xff09;编辑器&#xff0c;支持图文混排、引用、大标题、无序列表&#xff0c;字体颜色、加粗、斜体。 可用于独立web项目开发&#xff0c;也可以用于APICloud、DCloud、蓝鸟(BlueBird)、hybrid等混合APP开发。 zx-editor官网&#xff…

cxz

原博客地址www.19900507.com 父组件&#xff1a; <editUser ref"editUser"></editUser> /*** 编辑会员*/handleEdit(row) {var _thisthis;_this.$refs.editUser.getUser(row.id)},在父组件中引用子组件<editUser> 并起名ref"editUser" 然…

Git实用(ZX)技巧记录

rebase 代替 merge 同步代码 rebase 变基操作&#xff0c;移动你分支根节点 适用场景 想拉取最新主分支代码&#xff0c;但又不想多出一条merge的提交信息 使用方式 git rebase origin 主分支名称 与Merge区别 使用merge同样可以达到同步代码的效果&#xff0c;但使用mer…

元宇宙的21个ZX

世界不缺少热点&#xff0c;也不能缺少热点&#xff0c;热点是时代发展的一个可能性&#xff0c;而但凡“可能”&#xff0c;就会伴随“不可能力量”与之对抗&#xff0c;并完成真理的验证。 就像你看到的那样&#xff0c;“元宇宙”成了街头巷尾言必称的热点&#xff0c;各路…