当前位置: 首页 > Web前端 > HTML

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

时间:2023-03-27 23:41:09 HTML

大家好,我是秋风。今天,我们来讨论一个牛逼的项目——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.js开发的工具。因此,也可以通过编写脚本来执行命令。我用一张图来描述他们之间的关系,标题的概念用红色强调。脚本能做那些事?最简单的就是重复的东西,处理数据格式,数据导入导出,制作各种简单常用的小工具,环境配置等等。具体的例子有:下载视频https://www.jianshu.com/p/0a0...下载音乐https://binaryify.github.io/N...统计单词https://geek-docs.com/shell/s...自动登录https://github.com/RWoxiN/Qia...功能太多就不一一列举了,反正你会的操作可以帮你化繁为简,你不会的操作可以帮你搞定。谁可以使用它?脚本不仅可以帮助开发人员,也可以帮助非开发人员。例如,很多人喜欢在个人博客上写文章。这时候就可以使用WordPress来快速搭建一个博客,然后我们就可以使用脚本来一键安装WordPress了。下面以shell脚本为例:https://gist.github.com/dessi...zx,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];thenfifiif["${file##*.}"x="mp3"x];然后fifiNode、zxif(dirs[i]&&!fs.statSync(source).isDirectory()){if(source.endsWith(".mp4")){}if(source.endsWith(".mp3")){}}使用shell编写整体代码非常简洁,但是对于不经常使用的人来说,经常会遇到一些问题,比如if语句格式非常严格,判断比较的特殊方式,以及字符串操作比较麻烦。优势Node=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('数据',(数据)=>{console.error(`stderr:${data}`);});cmd.on('关闭',(代码)=>{console.log(`子进程退出代码${code}`);rev();});})}...awaitrun(["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}-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入门体验非常好,可以用四个字来概括,“简单易用”,所以far,你对zx着迷了吗?