如何優(yōu)雅地管理你的 shell 腳本憋肖?

原文鏈接

image

幾乎所有的程序員都或多或少接觸過 shell 腳本寿酌,在 shell 腳本的使用過程中胰苏,我們會遇到一些痛點,比如:執(zhí)行方式醇疼、使用方法等硕并。

本文,我們將簡要分析一下這些痛點秧荆,并最終給出一種優(yōu)雅的解決方式倔毙。

執(zhí)行方式

一般我們執(zhí)行腳本的方式主要分為兩種:

  • 路徑調(diào)用,如:./path/to/script.sh乙濒、sh ./path/to/script.sh
  • 全局調(diào)用陕赃,如:將 shell 腳本代碼直接寫入 ~/.zshrc 或使用 alias 指定具體的腳本路徑,從而實現(xiàn)全局調(diào)用颁股。

不過么库,這兩種方式顯然不夠優(yōu)雅,下面我們來具體分析一下甘有。

路徑調(diào)用

絕大多數(shù)人都會采用這種方式來執(zhí)行腳本廊散。路徑調(diào)用的優(yōu)點是操作簡單易懂;但是缺點也很明顯——我們需要提前知道每個腳本在文件系統(tǒng)中的位置梧疲。

在交叉調(diào)用的場景下允睹,通過相對路徑很難進行操作运准,只能通過絕對路徑來進行調(diào)用。比如:在 ~/chuquan/Develop/A/ 目錄下調(diào)用 ~/chuquan/Github/B/script.sh 時缭受,只能通過絕對路徑進行調(diào)用胁澳。

全局調(diào)用

為了解決路徑調(diào)用的所存在的問題,有些人可能會采用以下幾種方式來解決米者。

第一種方式是:將 shell 腳本的代碼寫入 shell 配置文件中韭畸,如: ~/.zshrc。比如蔓搞,將下面的函數(shù)加到 ~/.zshrc 末尾胰丁,然后執(zhí)行 source ~/.zshrc 或重啟終端后,我們就能進行全局調(diào)用 chuquan 這段 shell 腳本喂分。

# ~/.zshrc 的末尾
func chuquan() {
    echo "Hello, CHUQUAN"
}
# 全局調(diào)用 chuquan
$ chuquan
Hello, CHUQUAN

上述方式的原理是:在終端啟動時锦庸,系統(tǒng)會根據(jù)其所指定的 shell 加載對應(yīng)的配置文件。如果默認 shell 是 zsh蒲祈,那么會加載 ~/.zshrc 配置文件甘萧。我們在 ~/.zshrc 中寫入 shell 函數(shù)會成為全局函數(shù),從而實現(xiàn) shell 腳本的全局調(diào)用梆掸。

這種方式的主要缺點在于:

  • ~/.zshrc 中不能存在同名的腳本函數(shù)扬卷,如果存在,后者會覆蓋前者酸钦。
  • 如果腳本代碼特別多怪得,會導(dǎo)致 ~/.zshrc 文件變大,最終 shell 啟動時加載 ~/.zshrc 的時間也會相應(yīng)變長卑硫。

第二種方式是:使用 alias 針對每一個腳本及其絕對路徑徒恋,定義一個別名。比如拔恰,通過 alias 命令為 ~/chuquan/hello.sh 指定一個別名 hello因谎,從而實現(xiàn)全局調(diào)用。

$ alias hello=~/chuquan/hello.sh

這種方式可以解決第一種方式的缺點颜懊。當(dāng)時它并不夠優(yōu)雅财岔,如果腳本非常多,對應(yīng)的別名也會非常多河爹,對于用戶而言匠璧,我們真的都能記住嗎?

使用方法

關(guān)于使用方法咸这,我們經(jīng)常會遇到這樣的情況:當(dāng)別人寫了一個非常牛逼的腳本后夷恍,我們想要使用它時卻并不清楚其確切的作用,甚至不知道它執(zhí)行時需要哪些參數(shù)媳维。在這種情況下酿雪,我們經(jīng)常會與一些可以提升工作效率的腳本工具失之交臂遏暴。對此,最好的解決方式就是腳本的作者在腳本中給出使用提示指黎、參數(shù)提示朋凉。

NOX

為了解決上述的問題,我寫了一個基于 zsh 的腳本管理工具——NOX醋安。

NOX 主要有一下這些特點:

  • 系統(tǒng)調(diào)用:NOX 實現(xiàn)了一個唯一的主命令 nox杂彭,并將用戶腳本的存放路徑和腳本名稱轉(zhuǎn)換為子命令,從而實現(xiàn)全局調(diào)用吓揪。比如:通過 nox poker ace 命令來調(diào)用 scripts/poker/ace.sh 腳本亲怠。
  • 自動補全:如果說用戶手動輸入類似 nox poker ace 這樣的命令會很費時,那么 NOX 也實現(xiàn)了一種優(yōu)雅的解決方案——支持 Tab 自動補全柠辞。通過 Tab 自動補全团秽,從而加速命令的索引和調(diào)用。
  • 幫助選項:為了解決用戶不知道腳本如何使用的問題钾腺,NOX 提供的 nox system create 命令可以為開發(fā)者快速創(chuàng)建一個默認支持 --help(或 -h) 選項的腳本模板徙垫。腳本開發(fā)者只需要修改腳本模板中關(guān)于腳本使用用法的描述即可讥裤。
  • 調(diào)試模式:為了方便用戶進行腳本調(diào)試放棒,NOX 在腳本模板中默認支持了 --debug(或 -x)選項,可以輕松將腳本執(zhí)行模式切換至調(diào)試模式己英。
  • 私有命令:NOX 可以作為一個開發(fā)團隊的工具箱间螟,同時為了支持私有命令,NOX 默認不會將以 _ 為前綴的目錄或腳本名稱加入 git 管理损肛。

使用示例

下圖所示是一個通過 NOX 調(diào)用 scripts/poker/ace.sh 腳本的示例厢破。示例中使用 nox poker ace --count 10 命令,期間結(jié)合 tab 自動補全進行快速索引治拿,最終調(diào)用 scripts/poker/ace.sh 腳本摩泪,并傳入腳本選項 --count 和參數(shù) 10

是不是很酷炫劫谅?

image

系統(tǒng)命令

NOX 的本質(zhì)是一個腳本管理工具见坑,它的目標(biāo)還是為腳本服務(wù)。為此捏检,NOX 提供了 3 個內(nèi)置的系統(tǒng)命令供用戶進行使用荞驴。

創(chuàng)建目錄/腳本

NOX 提供了 nox system create,該命令能夠創(chuàng)建一個模板目錄或模板腳本贯城,具體使用選項進行區(qū)分熊楼。

  • nox system create --dir <dirname>:可以創(chuàng)建一個腳本目錄,默認會在該目錄下創(chuàng)建一個 .description 文件能犯,用于描述該目錄分類下的腳本的功能鲫骗。
  • nox system create --script <script-name-without-suffix>:可以創(chuàng)建一個模板腳本犬耻,該腳本默認符合 NOX 開發(fā)規(guī)范,用戶只需要修改對該腳本進行定制修改即可执泰。

編譯自動補全邏輯

自動補全功能的核心是一個描述自動補全邏輯的自動補全文件香追,對此,NOX 提供了一個命令 nox system build 以供編譯生成對應(yīng)的自動補全文件坦胶。該命令會生成一個 _nox 文件透典,并存放在 fpath/ 目錄下。

當(dāng)我們創(chuàng)建一個目錄或腳本后顿苇,需要執(zhí)行 nox system build 命令峭咒,從而生成一個新的自動補全文件。然后纪岁,我們需要執(zhí)行 source ~/.zshrc 或重啟終端以更新自動補全邏輯凑队。

更新

NOX 可用于團隊協(xié)作,當(dāng)其他開發(fā)者貢獻了一些新的腳本后幔翰,我們可以通過執(zhí)行 nox system update 來更新 NOX 倉庫漩氨,從而享受最新的功能。

開發(fā)指南

NOX 能夠?qū)⒆约壕帉懙哪_本轉(zhuǎn)換成系統(tǒng)命令遗增,這是一個非辰芯酷炫的特點,此時的你想必也躍躍欲試做修。這里有一個簡單的例子霍狰,詳細介紹了如何開發(fā)一個符合 NOX 規(guī)范的腳本,詳見 傳送門饰及。

總結(jié)

NOX 提供了一種優(yōu)雅地管理 shell 腳本的解決方案蔗坯,它將 shell 腳本轉(zhuǎn)換成了系統(tǒng)命令,并提供了強大的自動補全功能燎含。歡迎大家來安裝宾濒、使用并提出修改意見~

參考

  1. nox
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市屏箍,隨后出現(xiàn)的幾起案子绘梦,更是在濱河造成了極大的恐慌,老刑警劉巖铣除,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谚咬,死亡現(xiàn)場離奇詭異,居然都是意外死亡尚粘,警方通過查閱死者的電腦和手機择卦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人秉继,你說我怎么就攤上這事祈噪。” “怎么了尚辑?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵辑鲤,是天一觀的道長。 經(jīng)常有香客問我杠茬,道長月褥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任瓢喉,我火速辦了婚禮宁赤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘栓票。我一直安慰自己决左,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布走贪。 她就那樣靜靜地躺著佛猛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坠狡。 梳的紋絲不亂的頭發(fā)上继找,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音擦秽,去河邊找鬼码荔。 笑死漩勤,一個胖子當(dāng)著我的面吹牛感挥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播越败,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼触幼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了究飞?” 一聲冷哼從身側(cè)響起置谦,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亿傅,沒想到半個月后媒峡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡葵擎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年谅阿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡签餐,死狀恐怖寓涨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情氯檐,我是刑警寧澤戒良,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站冠摄,受9級特大地震影響糯崎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜河泳,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一拇颅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乔询,春花似錦樟插、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至食拜,卻和暖如春鸵熟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背负甸。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工流强, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呻待。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓打月,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蚕捉。 傳聞我的和親對象是個殘疾皇子奏篙,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容