除了 zsh/mathfunc、zsh/net/socket、zsh/net/tcp,zsh 還內置了一些其餘的內置模塊。本文簡單講幾個比較經常使用的模塊。git
# 使用 zmodload 加模塊名來加載模塊
% zmodload zsh/mathfunc
# 若是不加參數,能夠查看如今已經加載了的模塊
% zmodload
zsh/complete
zsh/complist
zsh/computil
zsh/main
zsh/mathfunc
zsh/parameter
zsh/stat
zsh/zle
zsh/zutil
# 加 -u 參數能夠卸載模塊
% zmodload -u zsh/mathfunc
# 還有其餘參數,能夠補全查看幫助,不詳細介紹了
% 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複製代碼
咱們知道使用 date 命令能夠查看當前時間,也能夠用來作日期時間的格式轉換。但若是腳本里須要頻繁地讀取或者處理時間(好比打日誌的時候,每一行加一個時間戳),那麼調用 date 命令的資源消耗就太大了。Zsh 的 zsh/datetime 模塊提供和 date 命令相似的功能。github
% zmodload zsh/datetime
# 輸出當前時間戳(從 1970 年年初到如今的秒數),和 date +%s 同樣
% echo $EPOCHSECONDS
1504231297
# 輸出高精度的當前時間戳,浮點數
% echo $EPOCHREALTIME
1504231373.9913284779
# 輸出當前時間戳的秒和納秒部分,是一個數組
# 能夠用 epochtime[1] 和 epochtime[2] 分別讀取
% echo $epochtime
1504231468 503125900
# 安裝指定格式輸出當前時間,和 date +%... 效果同樣
# 格式字符串能夠 man date 或者 man strftime 查看
% strftime "%Y-%m-%d %H:%M:%S (%u)" $EPOCHSECONDS
2017-09-01 10:06:47 (5)
# 若是加了 -s str 參數,將指定格式的時間存入 str 變量而不輸出
% strftime -s str "%Y-%m-%d %H:%M:%S (%u)" $EPOCHSECONDS
% echo $str
2017-09-01 10:10:58 (5)
# 若是加了 -r 參數,從指定的時間字符串反解出時間戳,以前操做的逆操做
# 也能夠同時加 -s 參數來說結果存入變量
% strftime -r "%Y-%m-%d %H:%M:%S (%u)" "2017-09-01 10:10:58 (5)"
1504231858複製代碼
這基本覆蓋了 date 的經常使用功能,而運行速度比 date 命令快不少。正則表達式
有時咱們的腳本須要將某些數據持久化到本地文件,但像哈希表之類的數據,若是存放到普通文件裏,載入和保存的資源消耗都比較大,並且若是腳本忽然異常退出,數據會丟失。並且某些時候,咱們可能須要操做一個巨大的哈希表,並不能所有將它載入到內存中。那麼咱們可使用 gdbm 數據庫文件。數據庫
Gdbm 是一個很輕量的 Key-Value 數據庫,能夠認爲它就像一個保存在文件裏的哈希表。Zsh 的 zsh/db/gdbm 模塊能夠很方便地讀寫 gdbm 數據庫文件。數組
% zmodload zsh/db/gdbm
# 聲明數據庫文件對應的哈希表
% local -A sampledb
# 建立數據庫文件,文件名是 sample.gdbm,對應 sampledb 哈希表
# 若是該文件已經存在,則會繼續使用該文件
% ztie -d db/gdbm -f sample.gdbm sampledb
# 而後正常使用 sampledb 哈希表便可,數據會同步寫入到數據庫文件中
% sampledb[k1]=v1
% sampledb+=(k2 v2 k3 v3)
% echo ${(kv)sampledb}
k1 v1 k2 v2 k3 v3
# 獲取數據庫文件路徑
% zgdbmpath sampledb
% echo $REPLY
/home/goreliu/sample.gdbm
# 釋放數據庫文件
% zuntie -u sampledb
# 也能夠用只讀的方式加載數據庫文件
% ztie -r -d db/gdbm -f sample.gdbm sampledb
# 但這樣的話,須要用 zuntie -u 釋放數據庫文件
% zuntie -u sampledb複製代碼
若是數據量比較大,或者有比較特別的需求,要先了解下 gdbm 是否符合本身的場景再使用。bash
有時咱們須要在將來的某個時刻運行某一個命令。雖然也能夠 sleep 而後運行,但這樣要多佔兩個進程,並且很差控制(好比要取消運行其中的某一個)。Zsh 的 zsh/sched 模塊用於調度命令的運行。微信
% zmodload zsh/sched
# 5 秒後運行 ls 命令
% sched +5 ls
# 能夠隨便作些別的
% date
Fri Sep 1 10:36:16 DST 2017
# 五秒後,ls 命令被運行
git sample.gdbm tmp
# 不加參數能夠查看已有的待運行命令
% 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 個待運行命令
% sched -2
% sched
1 Fri Sep 1 21:16:05 date
2 Fri Sep 1 21:17:12 date複製代碼
有時咱們可能須要更精細地操做文件,zsh 提供了一個 zsh/system 模塊,裏邊包含一些底層的文件讀寫命令(對應 open、read、write 等系統調用)。使用這些函數,能夠更精細地控制文件的讀寫,好比控制每次讀寫的數據量、從中間位置讀寫、上文件鎖等等。這些命令的用法比較複雜,參數也比較多,這裏就不列出了。若是須要使用,能夠 man zshmodules 而後搜索 zsh/system 查看文檔。socket
函數列表:sysopen、sysread、sysseek、syswrite、zsystem flock、systell、syserrortcp
其他的在腳本編寫方面可能用的上的模塊還有:ide
zsh/pcre(使用 pcre 正則表達式庫,默認使用的是 POSIX regex 庫)
zsh/stat(內部的 stat 命令,可用於取代 stat 命令)
zsh/zftp(內置的 ftp 客戶端)
zsh/zprof(Zsh 腳本的性能追蹤工具)
zsh/zpty(操做 pty 的命令)
zsh/zselect(select 系統調用的封裝)
能夠用 man zshmodules 查看。
若是由於性能等因素,要本身寫 zsh 模塊來調用,也是比較方便的。Zsh 的源碼中 Src/Modules 是模塊目錄,裏邊有一個實例模塊 example(example.c 和 example.mdd 文件)。能夠參考代碼編寫本身的模塊,難度並非很大。
本文介紹了幾個比較經常使用的 zsh 內置模塊,之後可能繼續補充更多模塊的用法。
全系列文章地址:github.com/goreliu/zsh…
付費解決 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等領域相關問題,靈活訂價,歡迎諮詢,微信 ly50247。