1個月增長15000 star,zx 庫寫shell腳本真不錯~

大家好,我是若川。持續組織了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

識別方二維碼加我微信、拉你進源碼共讀

今日話題

略。分享、收藏、點贊、在看我的文章就是對我最大的支持~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274980.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274980.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274980.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

灰色邊框陰影_50種暗模式灰色陰影

灰色邊框陰影If you’re an avid dark mode user like me, you’ll know that dark mode isn’t just about white text on black backgrounds. In a single app, a handful of shades of gray give the app some depth. And across various apps, the spectrum of gray become…

Android源代碼下載

為什么80%的碼農都做不了架構師?>>> Android代碼使用git管理, 所以關于Android源碼下載一般來說要安裝git. 本文是講述只使用Eclipse完成Android源碼下載和關聯. 下載Eclipse,目前最新版本是Juno,自帶了EGit插件-->Eclipse Git插件 那么可以使用EGit…

關于nginx調轉404錯誤頁面

在server{}模塊添加如下: error_page 404 /404.html; location /404.html { root /var/www/html/sina/; #“404目錄地址” }轉載于:https://www.cnblogs.com/alang85/archive/2012/03/01/404_error.html

尤雨溪:Vue 3 將成為新的默認版本

過完年,大年初七,Vue3 將成為默認版本,這時感覺我之前寫的幾篇文章都可以抽空更新一版了。尤雨溪推薦神器 ni ,能替代 npm/yarn/pnpm ?簡單好用!源碼揭秘!Vue 3.2 發布了,那尤雨溪是…

shell編程系列20--文本處理三劍客之awk常用選項

shell編程系列20--文本處理三劍客之awk常用選項awk選項總結選項 解釋 -v 參數傳遞 -f 指定腳本文件 -F 指定分隔符 -V 查看awk的版本號[rootlocalhost shell]# awk -v num2"$num1" -v var1"$var" BEGIN{print num2,var…

v-charts加載動畫_加載動畫-用戶體驗寫作練習

v-charts加載動畫Many new UX writers often struggle to find the balance between creativity and clarity. You can’t make everything fun/exciting/interesting as it can have an adverse effect on usability. But there are times when you can add a bit of flair.許…

linux 常用命令收集

關機:poweroff,shutdown -h now,init 0重啟:reboot,shutdown -r now,init 6 關閉x-window:init 3啟動x-window:init 5,start x1.終止命令:ctrlc 2.結束輸入…

34歲回顧人生,也怕中年危機!

大家好,我是若川。持續組織了5個月源碼共讀活動,感興趣的可以點此加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。最近發生一件令人感…

蛋花花APP,APP開發這幾點你要注意了

蛋花花君又來了,這次蛋花花君為大家分享的是APP開發過程中需要注意的幾點。 1、用戶體驗 程序猿蛋花花覺得,APP開發是為客戶來開發的,而不單單是為了老板,畢竟真正使用的是廣大用戶。APP的設計應該從用戶的角度出發,提…

svg動畫制作_制作第一個SVG動畫

svg動畫制作Story of a designer trying to code animations instead of asking a dev to figure it out.一位設計師嘗試編寫動畫代碼而不是要求開發人員弄清楚動畫的故事。 編碼動畫是Webdesign的未來 (Coded animations are the future of Webdesign) Because we have acces…

網站前端設計,從960框架開始

一個網站進入到前端設計階段,第一步肯定是為全站搭建一個統一的,基礎的HTML模型,在這里推薦一下我剛學習的960框架。960是一個CSS框架,你肯定在想,這個世界肯定是瘋了,連CSS都有框架了嗎,沒錯&a…

60+ 實用 React 工具庫,助力你高效開發!

大家好,我是若川。持續組織了5個月源碼共讀活動,感興趣的可以點此加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。最近看到一些實用的…

2012年12月第二個周末

2019獨角獸企業重金招聘Python工程師標準>>> 這周,裝上了windows版的 Linux版的oracle 熟悉了下SQL*PLUS的編程規則,還有常用的linux命令 看了一本《簡愛》 正在看oracle 轉載于:https://my.oschina.net/u/204616/blog/545513

『C#基礎』調用CMD的一個小工具

由于經常要使用CMD的一些命令,比如查看IP,Ping一個網址之類的。于是就寫了一個調用CMD.exe的小工具。 主要就是實現這樣一個事情:調用CMD.exe然后傳給它我想要執行的命令,最后獲取結果。 界面: 代碼: 主要執…

小姐姐:如何參與大型開源項目-Taro 共建

大家好,我是若川。持續組織了5個月源碼共讀活動,感興趣的可以點此加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。“本文來自前端程序…

JavaWeb學習總結(十七)——JSP中的九個內置對象

2019獨角獸企業重金招聘Python工程師標準>>> 一、JSP運行原理 每個JSP 頁面在第一次被訪問時,WEB容器都會把請求交給JSP引擎(即一個Java程序)去處理。JSP引擎先將JSP翻譯成一個_jspServlet(實質上也是一個servlet) ,然…

C#網絡編程(異步傳輸字符串) - Part.3[轉自JimmyZhang博客]

源碼下載:http://www.tracefact.net/SourceCode/Network-Part3.rar C#網絡編程(異步傳輸字符串) - Part.3 這篇文章我們將前進一大步,使用異步的方式來對服務端編程,以使它成為一個真正意義上的服務器:可以為多個客戶端的多次請求…

chrome黑暗模式_黑暗模式:如何克服黑暗面

chrome黑暗模式This article has been written by Redmadrobot Design Lab. Translated and reposted with permission by Alconost Inc., professional translation and localization company.本文由 Redmadrobot設計實驗室 撰寫 。 經過 專業翻譯和本地化公司 Alconost Inc.的…

Deco 智能代碼體驗版正式上線啦,快來體驗設計稿一鍵生成代碼~

Deco 是什么?—Deco 智能代碼項目是我們團隊在「前端智能化」方向上的探索,其聚焦設計稿一鍵生成多端代碼這一切入點,實現將 Sketch/Photoshop 等設計稿進行解析并直接生成多端代碼(Taro/React/Vue)的能力。Deco 可以使…

jQuery 五角星評分

五角星打分 我用的是搜狗輸入法上帶的特殊符號打出來的 空五角星&#xff1a;☆ 實五角星&#xff1a;★ 1.html 1 <ul class"comment"> 2 <li>☆</li> 3 <li>☆</li> 4 <li>☆</li> 5 …