介绍除了zsh/mathfunc,zsh/net/socket,zsh/net/tcp,zsh还有一些其他的内置模块。本文简单说说一些比较常用的模块。模块的使用方法#使用zmodload加上模块名加载模块%zmodloadzsh/mathfunc#如果不加参数可以查看现在已经加载的模块%zmodloadzsh/completezsh/complistzsh/computilzsh/mainzsh/mathfunczsh/parameterzsh/statzsh/zlezsh/zutil#添加-u参数卸载模块%zmodload-uzsh/mathfunc#还有其他参数,可以补全查看帮助,不做详细介绍%zmodload---option---A--createmodulealiases-F--handlefeatures-I--defineinfixconditionnames-L--outputintheformofcallstozmodload-P--arrayparamforfeatures-R--移除modulealiases-a--autoloadmodule-b--builtins的自动加载模块-c--条件代码的自动加载模块-d--列出或指定模块依赖项-e--测试模块是否被加载-f--自动加载模块数学函数-i--如果命令什么都不做,则抑制错误-l--列出特征-m--将特征参数视为模式-p--参数的自动加载模块-u--卸载模块日期和时间相关的模块我们知道使用date命令可以查看当前时间,也可以用来做日期时间格式的转换。但是如果脚本需要频繁的读取或者处理时间(比如打日志的时候,每行加上一个时间戳),那么调用date命令的资源消耗就太大了。Zsh的zsh/datetime模块提供了类似于date命令的功能。%zmodloadzsh/datetime#输出当前时间戳(从1970年初到现在的秒数),同date+%s%echo$EPOCHSECONDS1504231297#输出当前时间戳,精度高,浮点数%echo$EPOCHREALTIME1504231373.9913284779#输出当前时间戳的秒和纳秒部分,是一个数组#可以用epochtime[1]和epochtime[2]读取%echo$epochtime1504231468503125900#安装指定格式输出当前时间,anddate+%...效果相同#格式字符串可以在mandate或者manstrftime%strftime"%Y-%m-%d%H:%M:%S(%u)"$EPOCHSECONDS2017-09查看-0110:06:47(5)#如果加上-sstr参数,则将指定格式的时间保存在str变量中,不输出%strftime-sstr"%Y-%m-%d%H:%M:%S(%u)"$EPOCHSECONDS%echo$str2017-09-0110:10:58(5)#如果加??上-r参数,则从指定的时间字符串中解密出时间戳,而前面操作的逆操作#也可以同时加上-s参数将结果存入变量%strftime-r"%Y-%m-%d%H:%M:%S(%u)""2017-09-0110:10:58(5)"1504231858基本涵盖了date的常用功能,去掉了,运行速度比date命令快很多。读写gdbm数据库有时候我们的脚本需要持久化一些数据到本地文件,但是如果哈希表等数据存储在普通文件中,加载和保存的资源消耗比较大,而且如果脚本突然异常退出,数据会迷路。而有时,我们可能需要操作一个庞大的哈希表,而我们无法将其全部加载到内存中。然后我们就可以使用gdbm数据库文件了。gdbm是一个非常轻量级的Key-Value数据库,可以认为是一个存储在文件中的哈希表。zsh的zsh/db/gdbm模块可以方便的读写gdbm数据库文件。%zmodloadzsh/db/gdbm#声明数据库文件对应的哈希表%local-Asampledb#创建一个数据库文件,文件名为sample.gdbm,对应sampledb哈希表#如果文件已经存在,则会继续使用file%ztie-ddb/gdbm-fsample.gdbmsampledb#然后正常使用sampledb哈希表,数据会同步写入数据库file%sampledb[k1]=v1%sampledb+=(k2v2k3v3)%echo${(kv)sampledb}k1v1k2v2k3v3#获取数据库文件路径%zgdbmpathsampledb%echo$REPLY/home/goreliu/sample.gdbm#释放数据库文件%zuntie-usampledb#也可以使用只读的方式%ztie-r-ddb/gdbm-fsample.gdbmsampledb#但是这种情况下需要使用zuntie-u来释放数据库文件%zuntie-usampledb如果量数据量比较大,或者有特殊需求,使用前一定要先了解gdbm是否适合自己的场景。调度命令有时我们需要在未来的某个时间点运行某个命令。虽然也可以先休眠再运行,但是这样会多占用两个进程,而且不好控制(比如取消运行其中一个进程)。Zsh的zsh/sched模块用于调度命令的执行。%zmodloadzsh/sched#5秒后运行ls命令%sched+5ls#随意做任何其他事情%dateFriSep110:36:16DST2017#五秒后,ls命令运行gitsample.gdbmtmp#不加参数就可以查看现有要运行的命令%sched1FriSep121:16:05date2FriSep121:16:30date3FriSep121:17:12date#-n可以去掉nth待运行的命令%sched-2??%sched1FriSep121:16:05date2FriSep121:17:12date底层文件读写命令有时我们可能需要对文件进行更精细的操作,zsh提供了一个zsh/system模块,包含了一些低级的文件读写命令(对应open、read、write等系统调用)。使用这些函数,可以更精细地控制文件的读写,比如控制每次读写的数据量、从中间位置读写、锁定文件等。这些命令的用法比较复杂,参数也比较多,这里就不一一列举了。如果需要使用,可以manzshmodules然后搜索zsh/system查看文档。函数列表:sysopen、sysread、sysseek、syswrite、zsystemflock、systell、syserror等模块其他可能用到脚本编写的模块包括:zsh/pcre(使用pcre正则表达式库,默认为POSIX正则表达式库)zsh/stat(内部stat命令,可用于替换stat命令)zsh/zftp(内置ftp客户端)zsh/zprof(Zsh脚本的性能跟踪工具)zsh/zpty(操作pty的命令)zsh/zselect(封装选择系统调用)可以用manzshmodules查看。如果因为性能等因素不得不自己写zsh模块调用的话还是自己写模块比较方便。Zsh源码中,Src/Modules是模块目录,里面有example模块example(example.c和example.mdd文件)。大家可以参考代码自己写模块,难度不是很大。小结本文介绍几个常用的zsh内置模块,以后可能会继续添加更多模块的使用方法。本文不再更新,全系列文章更新维护在这里:github.com/goreliu/zshguideWindows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua等相关问题的付费解决方案,定价灵活,欢迎咨询,微信ly50247。