幾乎所有的程序員都或多或少接觸過 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
。
是不是很酷炫劫谅?
系統(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)命令,并提供了強大的自動補全功能燎含。歡迎大家來安裝宾濒、使用并提出修改意見~