第三个是使用 zsh 开发的好处。如果 zsh 和 bash 相比,没有明显的好处,为什么要学习和使用它呢?那么就要从 bash 痛点讲起了。我想经常写 bash 脚本的人,很少有人会举大拇指说 bash 真好用啊。相反,我曾经多次听某些开发者说我写过一个超过 2000(或者其他行数)行的 shell(bash)脚本。但几乎没有人会认为写一个超过 2000 行的 Python 脚本是一件多么特别的事情。蹩脚的语法(几乎所有从任何其他语言迁移过来的开发者,都要重新熟悉和习惯它的语法)、严重依赖外部命令(因为文件系统错误等问题,挂掉一个外部命令,脚本就休克了。命令版本不同会有用法上的微秒差别,调试测试困难。频繁起新进程性能低下)、功能孱弱蹩脚(很多需要频繁使用的功能不全面或者不好用,比如字符串处理和数组的用法)等等,让很多开发者非常头疼,其中有些人甚至主张禁止使用 shell 脚本,一律改用 Python 等等,但 Python 并非适用所有场景,而且也有另外的一些问题,这样做也是因噎废食。Zsh 并非将这些问题全部解决了,但和 bash 相比,有很大的改善。比如 zsh 支持多种风格的语法,开发者很容易找到亲切感;对外部命令的依赖比 bash 要轻很多,多数常用的功能不需要使用外部命令,性能更好,调试也更加方便;功能上和 bash 相比也有比较大的提升,处理不那么复杂的场景已经比较够用了。
有人可能会说,不如“一步到位”,使用 Powershell。Powershell 的确比 Python 更适合作为一种 shell 脚本语言,但使用它的话会有其他问题。
首先 Powershell 的学习成本是绝对要比 zsh 高的,如果想省点事,这并不是好的选择。
其次 Linux 下的 Powershell 目前还是 beta 版,以后会不会有很多人用也很难说,如果很少有人用,那么生态环境就成问题。比如遇到问题后找不到解决办法,配套的软件和库不完善等等。
再次 Powershell 解释器的启动速度非常感人,在我的机器上,Windows 下的 Powershell 空脚本要执行将近 200 毫秒,Linux 下的要更长一些(我只在 WSL 里安装试用过,时间翻了几倍),而 zsh 的话,在 Linux 下不超过 5 毫秒,在 WSL 下也不超过 20 毫秒。如果写一个简单的脚本,运行时都要卡一下,是非常影响体验的。
最后如果平时就使用 Powershell 作为交互 shell,那么虽然脚本的启动时间问题有所缓解,但用户体验会差很多,而且以后也很难提升上来,很容易得不偿失。
Zsh 脚本样例
可以通过一个例子直观感受下用 zsh 写的脚本。这是一个删除当前目录以及所有子目录下重复文件的脚本,通过 md5 判断文件是否相同(不严谨)。熟悉 bash 的读者可以尝试用 bash 完成相同的功能,然后对比一下代码(我之前写过一个 bash 版本的,不贴上来了),就能比较直观地感受到 bash 和 zsh 的区别了。
#!/bin/zsh
local files=("${(f)$(md5sum **/*(.D))}")
local files_to_delete=()
local -A md5s
for i ($files) {
local md5=$i[1,32]
if (($+md5s[$md5])) {
files_to_delete+=($i[35,-1])
} else {
md5s[$md5]=1