本文是关于zsh(不是oh-my-zsh)与bash的对比,主要参考(翻译)自Quora上的一个回答以及stackexchange上的一些讨论。标题不用vs是不想让读者产生二选一的想法。
Shell简史
早期Unix上的shell是由Ken Thompson在贝尔实验室完成的,用于Unix 1-6版(Ken Thompson也是Unix和B语言的创造者之一),目前已经不再使用了。
后来,John Mashey在Unix的PWB版本(一个专门面向程序开发者组织的版本)上对Ken Thompson的shell进行了改进,增加了shell变量(环境变量的前身),脚本执行能力,中断处理以及新的控制结构。
在Unix v7版中,Stephen R. Bourne完整的重写了shell,也就是我们现在所说的sh,全称Bourne shell。它的二进制文件为/bin/sh
,但是目前的*nix发行版大多将这个文件替换为了指向其它shell的硬链接或者软链接,或者干脆是bash的posix选项重编译版,比如我的mac上是,sh实际上是bash:
ll /bin/sh /bin/bash
-r-xr-xr-x 1 root wheel 612K 9 14 08:57 /bin/bash
-r-xr-xr-x 1 root wheel 616K 9 14 08:57 /bin/sh
/bin/sh
sh-3.2$ help
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
...
有人在这里讨论了mac上这个蛋疼的问题。
而目前*nix系统上的默认shell,bash,Bourne-Again shell,是GNU对sh的重写,bash在功能上是sh的超集。
其它的shell,像csh、zsh则各有所长,但是对posix标准的支持没有bash那么严格,因此在大多数的shell脚本教程中,仍然是推荐使用#!/bin/bash
做解释器,
这也是为什么目前很多*nix系统使用bash作为默认shell的原因之一。
Zsh与Bash的比较
- bash script更加接近posix标准,zsh则更
佳加(´▽`)“灵活” - bash基本上上手即用,zsh则需要繁杂的配置(但我们有神一样的oh-my-zsh)
- 二者的prompte不同,zsh的prompte可定制性更高
- zsh的自动补全功能更加强大
- zsh的拼写检查功能更强
总结
从一个交互式终端的角度来讲,zsh更为强大,但是作为脚本解释器,bash更加符合posix标准,因此,建议读者日常使用zsh(配合oh-my-zsh),但是使用bash做脚本解释器。