導(dǎo)讀
除了 zsh/mathfunc、zsh/net/socket、zsh/net/tcp,zsh 還內(nèi)置了一些其他的內(nèi)置模塊。本文簡(jiǎn)單講幾個(gè)比較常用的模塊。
模塊的使用方法
# 使用 zmodload 加模塊名來(lái)加載模塊
% zmodload zsh/mathfunc
# 如果不加參數(shù),可以查看現(xiàn)在已經(jīng)加載了的模塊
% zmodload
zsh/complete
zsh/complist
zsh/computil
zsh/main
zsh/mathfunc
zsh/parameter
zsh/stat
zsh/zle
zsh/zutil
# 加 -u 參數(shù)可以卸載模塊
% zmodload -u zsh/mathfunc
# 還有其他參數(shù),可以補(bǔ)全查看幫助,不詳細(xì)介紹了
% zmodload -<tab>
-- option --
-A -- create module aliases
-F -- handle features
-I -- define infix condition names
-L -- output in the form of calls to zmodload
-P -- array param for features
-R -- remove module aliases
-a -- autoload module
-b -- autoload module for builtins
-c -- autoload module for condition codes
-d -- list or specify module dependencies
-e -- test if modules are loaded
-f -- autoload module for math functions
-i -- suppress error if command would do nothing
-l -- list features
-m -- treat feature arguments as patterns
-p -- autoload module for parameters
-u -- unload module
日期時(shí)間相關(guān)模塊
我們知道使用 date 命令可以查看當(dāng)前時(shí)間,也可以用來(lái)做日期時(shí)間的格式轉(zhuǎn)換。但如果腳本里需要頻繁地讀取或者處理時(shí)間(比如打日志的時(shí)候,每一行加一個(gè)時(shí)間戳),那么調(diào)用 date 命令的資源消耗就太大了。Zsh 的 zsh/datetime 模塊提供和 date 命令類似的功能。
% zmodload zsh/datetime
# 輸出當(dāng)前時(shí)間戳(從 1970 年年初到現(xiàn)在的秒數(shù)),和 date +%s 一樣
% echo $EPOCHSECONDS
1504231297
# 輸出高精度的當(dāng)前時(shí)間戳,浮點(diǎn)數(shù)
% echo $EPOCHREALTIME
1504231373.9913284779
# 輸出當(dāng)前時(shí)間戳的秒和納秒部分,是一個(gè)數(shù)組
# 可以用 epochtime[1] 和 epochtime[2] 分別讀取
% echo $epochtime
1504231468 503125900
# 安裝指定格式輸出當(dāng)前時(shí)間,和 date +%... 效果一樣
# 格式字符串可以 man date 或者 man strftime 查看
% strftime "%Y-%m-%d %H:%M:%S (%u)" $EPOCHSECONDS
2017-09-01 10:06:47 (5)
# 如果加了 -s str 參數(shù),將指定格式的時(shí)間存入 str 變量而不輸出
% strftime -s str "%Y-%m-%d %H:%M:%S (%u)" $EPOCHSECONDS
% echo $str
2017-09-01 10:10:58 (5)
# 如果加了 -r 參數(shù),從指定的時(shí)間字符串反解出時(shí)間戳,之前操作的逆操作
# 也可以同時(shí)加 -s 參數(shù)來(lái)講結(jié)果存入變量
% strftime -r "%Y-%m-%d %H:%M:%S (%u)" "2017-09-01 10:10:58 (5)"
1504231858
這基本覆蓋了 date 的常用功能,而運(yùn)行速度比 date 命令快很多。
讀寫 gdbm 數(shù)據(jù)庫(kù)
有時(shí)我們的腳本需要將某些數(shù)據(jù)持久化到本地文件,但像哈希表之類的數(shù)據(jù),如果存放到普通文件里,載入和保存的資源消耗都比較大,而且如果腳本突然異常退出,數(shù)據(jù)會(huì)丟失。而且某些時(shí)候,我們可能需要操作一個(gè)巨大的哈希表,并不能全部將它載入到內(nèi)存中。那么我們可以使用 gdbm 數(shù)據(jù)庫(kù)文件。
Gdbm 是一個(gè)很輕量的 Key-Value 數(shù)據(jù)庫(kù),可以認(rèn)為它就像一個(gè)保存在文件里的哈希表。Zsh 的 zsh/db/gdbm 模塊可以很方便地讀寫 gdbm 數(shù)據(jù)庫(kù)文件。
% zmodload zsh/db/gdbm
# 聲明數(shù)據(jù)庫(kù)文件對(duì)應(yīng)的哈希表
% local -A sampledb
# 創(chuàng)建數(shù)據(jù)庫(kù)文件,文件名是 sample.gdbm,對(duì)應(yīng) sampledb 哈希表
# 如果該文件已經(jīng)存在,則會(huì)繼續(xù)使用該文件
% ztie -d db/gdbm -f sample.gdbm sampledb
# 然后正常使用 sampledb 哈希表即可,數(shù)據(jù)會(huì)同步寫入到數(shù)據(jù)庫(kù)文件中
% sampledb[k1]=v1
% sampledb+=(k2 v2 k3 v3)
% echo ${(kv)sampledb}
k1 v1 k2 v2 k3 v3
# 獲取數(shù)據(jù)庫(kù)文件路徑
% zgdbmpath sampledb
% echo $REPLY
/home/goreliu/sample.gdbm
# 釋放數(shù)據(jù)庫(kù)文件
% zuntie -u sampledb
# 也可以用只讀的方式加載數(shù)據(jù)庫(kù)文件
% ztie -r -d db/gdbm -f sample.gdbm sampledb
# 但這樣的話,需要用 zuntie -u 釋放數(shù)據(jù)庫(kù)文件
% zuntie -u sampledb
如果數(shù)據(jù)量比較大,或者有比較特別的需求,要先了解下 gdbm 是否符合自己的場(chǎng)景再使用。
調(diào)度命令
有時(shí)我們需要在未來(lái)的某個(gè)時(shí)刻運(yùn)行某一個(gè)命令。雖然也可以 sleep 然后運(yùn)行,但這樣要多占兩個(gè)進(jìn)程,而且不好控制(比如要取消運(yùn)行其中的某一個(gè))。Zsh 的 zsh/sched 模塊用于調(diào)度命令的運(yùn)行。
% zmodload zsh/sched
# 5 秒后運(yùn)行 ls 命令
% sched +5 ls
# 可以隨便做些別的
% date
Fri Sep 1 10:36:16 DST 2017
# 五秒后,ls 命令被運(yùn)行
git sample.gdbm tmp
# 不加參數(shù)可以查看已有的待運(yùn)行命令
% sched
1 Fri Sep 1 21:16:05 date
2 Fri Sep 1 21:16:30 date
3 Fri Sep 1 21:17:12 date
# -n 可以去除第 n 個(gè)待運(yùn)行命令
% sched -2
% sched
1 Fri Sep 1 21:16:05 date
2 Fri Sep 1 21:17:12 date
底層的文件讀寫命令
有時(shí)我們可能需要更精細(xì)地操作文件,zsh 提供了一個(gè) zsh/system 模塊,里邊包含一些底層的文件讀寫命令(對(duì)應(yīng) open、read、write 等系統(tǒng)調(diào)用)。使用這些函數(shù),可以更精細(xì)地控制文件的讀寫,比如控制每次讀寫的數(shù)據(jù)量、從中間位置讀寫、上文件鎖等等。這些命令的用法比較復(fù)雜,參數(shù)也比較多,這里就不列出了。如果需要使用,可以 man zshmodules 然后搜索 zsh/system 查看文檔。
函數(shù)列表:sysopen、sysread、sysseek、syswrite、zsystem flock、systell、syserror
其他模塊
其余的在腳本編寫方面可能用的上的模塊還有:
zsh/pcre(使用 pcre 正則表達(dá)式庫(kù),默認(rèn)使用的是 POSIX regex 庫(kù))
zsh/stat(內(nèi)部的 stat 命令,可用于取代 stat 命令)
zsh/zftp(內(nèi)置的 ftp 客戶端)
zsh/zprof(Zsh 腳本的性能追蹤工具)
zsh/zpty(操作 pty 的命令)
zsh/zselect(select 系統(tǒng)調(diào)用的封裝)
可以用 man zshmodules 查看。
自己編寫模塊
如果因?yàn)樾阅艿纫蛩兀约簩?zsh 模塊來(lái)調(diào)用,也是比較方便的。Zsh 的源碼中 Src/Modules 是模塊目錄,里邊有一個(gè)實(shí)例模塊 example(example.c 和 example.mdd 文件)。可以參考代碼編寫自己的模塊,難度并不是很大。
總結(jié)
本文介紹了幾個(gè)比較常用的 zsh 內(nèi)置模塊,以后可能繼續(xù)補(bǔ)充更多模塊的用法。
本文不再更新,全系列文章在此更新維護(hù):github.com/goreliu/zshguide
付費(fèi)解決 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等領(lǐng)域相關(guān)問題,靈活定價(jià),歡迎咨詢,微信 ly50247。