Zsh 開發(fā)指南(第十八篇 更多內(nèi)置模塊的用法)

導(dǎo)讀

除了 zsh/mathfunc闪唆、zsh/net/socket檀何、zsh/net/tcp,zsh 還內(nèi)置了一些其他的內(nèi)置模塊掷漱。本文簡單講幾個比較常用的模塊。

模塊的使用方法

# 使用 zmodload 加模塊名來加載模塊
% 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

日期時間相關(guān)模塊

我們知道使用 date 命令可以查看當(dāng)前時間鹿榜,也可以用來做日期時間的格式轉(zhuǎn)換海雪。但如果腳本里需要頻繁地讀取或者處理時間(比如打日志的時候锦爵,每一行加一個時間戳),那么調(diào)用 date 命令的資源消耗就太大了奥裸。Zsh 的 zsh/datetime 模塊提供和 date 命令類似的功能险掀。

% zmodload zsh/datetime

# 輸出當(dāng)前時間戳(從 1970 年年初到現(xiàn)在的秒數(shù)),和 date +%s 一樣
% echo $EPOCHSECONDS
1504231297

# 輸出高精度的當(dāng)前時間戳湾宙,浮點數(shù)
% echo $EPOCHREALTIME
1504231373.9913284779

# 輸出當(dāng)前時間戳的秒和納秒部分樟氢,是一個數(shù)組
# 可以用 epochtime[1] 和 epochtime[2] 分別讀取
% echo $epochtime
1504231468 503125900

# 安裝指定格式輸出當(dāng)前時間,和 date +%... 效果一樣
# 格式字符串可以 man date 或者 man strftime 查看
% strftime "%Y-%m-%d %H:%M:%S (%u)" $EPOCHSECONDS
2017-09-01 10:06:47 (5)

# 如果加了 -s str 參數(shù)侠鳄,將指定格式的時間存入 str 變量而不輸出
% strftime -s str "%Y-%m-%d %H:%M:%S (%u)" $EPOCHSECONDS
% echo $str
2017-09-01 10:10:58 (5)

# 如果加了 -r 參數(shù)埠啃,從指定的時間字符串反解出時間戳,之前操作的逆操作
# 也可以同時加 -s 參數(shù)來講結(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ù)庫

有時我們的腳本需要將某些數(shù)據(jù)持久化到本地文件,但像哈希表之類的數(shù)據(jù)知押,如果存放到普通文件里叹螟,載入和保存的資源消耗都比較大,而且如果腳本突然異常退出台盯,數(shù)據(jù)會丟失罢绽。而且某些時候,我們可能需要操作一個巨大的哈希表静盅,并不能全部將它載入到內(nèi)存中良价。那么我們可以使用 gdbm 數(shù)據(jù)庫文件。

Gdbm 是一個很輕量的 Key-Value 數(shù)據(jù)庫蒿叠,可以認(rèn)為它就像一個保存在文件里的哈希表明垢。Zsh 的 zsh/db/gdbm 模塊可以很方便地讀寫 gdbm 數(shù)據(jù)庫文件。

% zmodload zsh/db/gdbm

# 聲明數(shù)據(jù)庫文件對應(yīng)的哈希表
% local -A sampledb
# 創(chuàng)建數(shù)據(jù)庫文件市咽,文件名是 sample.gdbm痊银,對應(yīng) sampledb 哈希表
# 如果該文件已經(jīng)存在,則會繼續(xù)使用該文件
% ztie -d db/gdbm -f sample.gdbm sampledb

# 然后正常使用 sampledb 哈希表即可施绎,數(shù)據(jù)會同步寫入到數(shù)據(jù)庫文件中
% sampledb[k1]=v1
% sampledb+=(k2 v2 k3 v3)
% echo ${(kv)sampledb}
k1 v1 k2 v2 k3 v3

# 獲取數(shù)據(jù)庫文件路徑
% zgdbmpath sampledb
% echo $REPLY
/home/goreliu/sample.gdbm

# 釋放數(shù)據(jù)庫文件
% zuntie -u sampledb


# 也可以用只讀的方式加載數(shù)據(jù)庫文件
% ztie -r -d db/gdbm -f sample.gdbm sampledb
# 但這樣的話溯革,需要用 zuntie -u 釋放數(shù)據(jù)庫文件
% zuntie -u sampledb

如果數(shù)據(jù)量比較大,或者有比較特別的需求谷醉,要先了解下 gdbm 是否符合自己的場景再使用致稀。

調(diào)度命令

有時我們需要在未來的某個時刻運(yùn)行某一個命令。雖然也可以 sleep 然后運(yùn)行俱尼,但這樣要多占兩個進(jìn)程抖单,而且不好控制(比如要取消運(yùn)行其中的某一個)。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 個待運(yùn)行命令
% sched -2
% sched
  1 Fri Sep  1 21:16:05 date
  2 Fri Sep  1 21:17:12 date

底層的文件讀寫命令

有時我們可能需要更精細(xì)地操作文件躺酒,zsh 提供了一個 zsh/system 模塊,里邊包含一些底層的文件讀寫命令(對應(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á)式庫,默認(rèn)使用的是 POSIX regex 庫)

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 查看罩锐。

自己編寫模塊

如果因為性能等因素,要自己寫 zsh 模塊來調(diào)用卤唉,也是比較方便的涩惑。Zsh 的源碼中 Src/Modules 是模塊目錄,里邊有一個實例模塊 example(example.c 和 example.mdd 文件)搬味【城猓可以參考代碼編寫自己的模塊,難度并不是很大碰纬。

總結(jié)

本文介紹了幾個比較常用的 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)問題,靈活定價扁掸,歡迎咨詢翘县,微信 ly50247。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谴分,一起剝皮案震驚了整個濱河市锈麸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牺蹄,老刑警劉巖忘伞,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異沙兰,居然都是意外死亡氓奈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門僧凰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來探颈,“玉大人,你說我怎么就攤上這事训措∥苯冢” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵绩鸣,是天一觀的道長怀大。 經(jīng)常有香客問我,道長呀闻,這世上最難降的妖魔是什么化借? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮捡多,結(jié)果婚禮上蓖康,老公的妹妹穿的比我還像新娘。我一直安慰自己垒手,他們只是感情好蒜焊,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著科贬,像睡著了一般泳梆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天优妙,我揣著相機(jī)與錄音乘综,去河邊找鬼。 笑死套硼,一個胖子當(dāng)著我的面吹牛卡辰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播邪意,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼看政,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抄罕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤于颖,失蹤者是張志新(化名)和其女友劉穎呆贿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體森渐,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡做入,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了同衣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竟块。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖耐齐,靈堂內(nèi)的尸體忽然破棺而出浪秘,到底是詐尸還是另有隱情,我是刑警寧澤埠况,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布耸携,位于F島的核電站,受9級特大地震影響辕翰,放射性物質(zhì)發(fā)生泄漏夺衍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一喜命、第九天 我趴在偏房一處隱蔽的房頂上張望沟沙。 院中可真熱鬧,春花似錦壁榕、人聲如沸矛紫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽含衔。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贪染,已是汗流浹背缓呛。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留杭隙,地道東北人哟绊。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像痰憎,于是被迫代替她去往敵國和親票髓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359

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