当前位置: 首页 > 科技观察

能用Js实现的终究是用Js实现的,Shell脚本也不例外

时间:2023-03-20 20:11:07 科技观察

大家好,我是秋风。今天,我们来讨论一个牛逼的项目——zx,它在一个月内增长了15000颗星,成为了2021年的第一星项目。zx到底是什么?我们从官网的介绍可以看出,它是一个比较方便的编写脚本的工具。(Atoolforwritingbetterscripts)Bash很棒,但是在编写脚本时,人们通常会选择更方便的编程语言。JavaScript是一个完美的选择,但标准的Node.js库在使用前需要额外的麻烦。zx包提供有用的child_process包装器,转义参数并提供合理的默认值。翻译:Bash非常适合编写脚本,但人们通常会选择更方便的方式来编写脚本,例如使用JavaScript这样的编程语言。但是Node.js在使用之前需要做很多额外的操作,比如打包,引用库等。但是zx提供了更方便的功能,也简化了child_process的打包,可以直接调用一些命令。通过阅读摘要和描述,我们可以看出,虽然Bash很棒,但它并不像Node.js那样简单。Node.js虽然写起来简单,但是在使用前还是有一些比较麻烦的操作。但是zx没有上述两种方式的缺点,可以化繁为简,操作简单方便。在继续深入理解zx之前,让我们先澄清一下目前提到的一些概念。了解这些概念将有助于我们更好地编写脚本。Shell,Shellscript,Bash,zx,Node首先说一下什么是shell。shell的中文意思是外壳,指的是连接运行内核的外壳。Shell狭义指的是命令行软件,多为Bash(Bash全称BourneAgainSHell,是linux标准的默认shell,它基于BourneShell,吸收了CShell和KornShell);从广义上讲,Shell包括图形界面。因此,Shell是一个很大的概念,包括Bash等命令行工具,使用这些工具编写的脚本称为Shell脚本;而Node是一种编程语言,可以编写js文件来执行一些命令,zx是基于Node开发的工具,因此也可以通过编写脚本来执行命令。我用一张图来描述他们之间的关系,标题的概念用红色强调。脚本能做什么?最简单的就是重复的东西,数据格式的处理,数据的导入导出,各种简单常用的小工具的制作,环境的配置等等。具体的例子有:下载视频https://www.jianshu.com/p/0a013fa5a250下载音乐https://binaryify.github.io/NeteaseCloudMusicApi/#/算词https://geek-docs.com/shell/shell-examples/the-shell-counts-the-number-of-lines-words-and-characters-in-the-file.html自动签到https://github.com/RWoxiN/Qiandao...功能太多就不一一列举了,反正你懂的操作可以帮你简化,还有你不知道的操作可以帮助你实现。谁可以使用它?脚本不仅可以帮助开发人员,也可以帮助非开发人员。例如,很多人喜欢在个人博客上写文章。这时候就可以使用WordPress来快速搭建一个博客,然后我们就可以使用脚本来一键安装WordPress了。下面以shell脚本为例:https://gist.github.com/dessibelle/2666478zx,Node,Shell(Bash)功能评测上面讲了脚本的一些概念以及脚本可以帮助我们做什么。那么既然脚本如此强大,脚本种类如此之多,为什么zx一经推出就大受欢迎呢?下面以实际功能为例来体验一下,使用zx、Node、Shell(Bash,以下简称Bash)三个脚本编写一个批量压缩音视频的脚本。实现一个音频功能主要分为四个步骤:1.遍历当前目录2.判断当前文件类型3.执行压缩音视频脚本首先我们来看三个遍历当前目录的脚本:Bash#!bin/bashforfilein`(ls)`;do...doneNodeimportfsfrom'fs';constdirs=fs.readdirSync('./'));for(letiindirs){...}zxconstdirs=(await$`ls`).stdout.split('\n')for(letiindirs){...}可以看到Bash和zx差不多,但是zx比Node省了包头代码。优点:zx=Bash>Node接下来我们看一下判断当前文件类型的三个脚本:Bashiftest-f$filethenfilename=$(basename$file);if["${file##*.}"x="mp4"x];thenfiif["${file##*.}"x="mp3"x];thenfifiNode、zxif(dirs[i]&&!fs.statSync(source).isDirectory()){if(source.endsWith(".mp4")){}if(source.endsWith(".mp3")){}}使用Shell写整体代码很简洁,但是对于不经常使用的人来说,经常会遇到存在一些问题,比如if语句格式严格,判断比较方式特殊,字符串操作比较麻烦。AdvantageNode=zx>Bash最后执行压缩音视频脚本:Bash...ffmpeg-i$file-r30-ccopy-c:vlibx264-vfscale=720:-2"${filename%%.*}-30-720".mp4;...Nodeconst{spawn}=require('child_process');functionrun(command){returnnewPromise((rev,rej)=>{console.log(command);constcmd=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(`childprocessexitedwithcode${code}`);rev();});})}...awaitrun(["ffmpeg","-i",source,"-r","30","-c","复制","-c:v","libx264","-vf","scale=720:-2",`${dirs[i].replace('.mp4','')}-30-720.mp4`]);...zx$`ffmpeg-i${file}-r30-ccopy-c:vlibx264-vfscale=720:-2${file.replace(".mp4","")}-30-720.mp4;`;使用zx可以达到和Shell一样的简化效果,并且使用一些内置的Node包可以大大减少整体代码量。Node需要写一些额外的代码,比如执行命令run等。优点bash=zx>Node熟悉度代码复杂Shell困难简洁Node简单繁琐zx简单简洁zx入门体验很好,可以用四个字来概括,“简单易用”,到目前为止,有你被zx吸引了吗?