Zsh越来越受更多人欢迎,号称“终极shell”,所以想去了解下它的过人之处,总之,从一个交互式终端的角度来讲,Zsh更为强大,而Bash更加符合posix标准,因此Bash更适合做脚本解释器。
一种流行的说法是,Zsh是与Bash兼容的。这种说法既对,也不对,因为Zsh本身作为一种脚本语言,是与Bash不兼容的。符合Bash规范的脚本无法保证被Zsh解释器正确执行。但是,Zsh实现中包含了一个屌炸天的仿真模式(emulation mode),支持对两种主流的Bourne衍生版shell(Bash、ksh)和C shell的仿真(csh的支持并不完整)。在Bash的仿真模式下,可以使用与Bash相同的语法和命令集合,从而达到近乎完全兼容的目的。为了激活对Bash的仿真,需要显式执行:
$ emulate Bash
等效于:
$ emulate sh
Bash上手快,基本直接就可以使用,但是Zsh则需要繁杂的配置(还需要用到 oh-my-Zsh),具体配置在后面讲述;
Zsh有几大特点明显优于Bash,具体特点如下:
① 色彩高亮、拼写检查:
- 根据你输入的内容来判断颜色种类,例如:白色代表普通命令或者程序内容,红色代表错误命令等;
② 命令提示:
- 这个可以说是最方便的功能,输入某命令后,后面就用灰色给你提示该命令的参数,随着动态不断输入,提示还会根据内容不断更新;
③ 智能补全:
- 传统
shell的补全功能在Zsh面前则是黯淡无光,尤其是在长路径切换的时候,不用像Bash一样持续提示你需要继续输入,只用连续敲击两次TAB键Zsh给你一个补全目录,让你来进行选择。
在 Mac 上将Zsh用作默认Shell
从 macOS Catalina 版开始,您的 Mac 将使用Zsh作为默认登录Shell和交互式Shell。您还可以在较低版本的 macOS 中将Zsh设置为默认Shell。
默认情况下,您的 Mac 使用Zsh或Bash作为登录Shell和交互式Shell的命令行解释器:
- 从 macOS Catalina 版开始
,Zsh (Z shell)是所有新建用户帐户的默认Shell。 Bash是 macOS Mojave 及更低版本中的默认Shell。Zsh与Bourne Shell (sh)高度兼容,并且与Bash基本兼容,但存在一些差别。要进一步了解Zsh及其全面的命令行完成系统,请在“终端”中输入man Zsh。
如何更改默认Shell
无论您的用户帐户是配置为使用Zsh(推荐)、Bash还是其他Shell,您都可以从“用户与群组”偏好设置或命令行中更改默认Shell。
- 从“用户与群组”偏好设置中更改。
- 选取苹果菜单 >“系统偏好设置”,然后点按“用户与群组”。
- 点按锁形图标 ,然后输入您的帐户名称和密码。
- 在左侧的用户列表中,按住
Control键点按您的用户名,然后选取“高级选项”。 - 从“
登录 Shell”菜单中选取一个Shell,然后点按“好”以存储更改。
从命令行中更改
在“终端”中,输入$ chsh -s path,其中的path是/etc/shells中列出的某个Shell路径,例如 /bin/Zsh、/bin/Bash、/bin/csh、/bin/dash、/bin/ksh、/bin/sh或/bin/tcsh。
如何在不更改默认Shell的情况下使用其他Shell
如果您不希望“终端”在新的“终端”窗口和标签页中使用默认的登录Shell,请按照以下步骤操作:
- 打开“终端”,然后选取“终端”>“偏好设置”。
- 从“通用”面板中,选择“命令(完整的路径)”。
- 在提供的栏位中,输入
/etc/shells中列出的某个Shell路径,例如/bin/Zsh、/bin/Bash、/bin/csh、/bin/dash、/bin/ksh、/bin/sh或/bin/tcsh。
如果您调用Bash Shell,而 macOS Catalina 已配置为使用另一个Shell,则您将看到一条信息,提示默认的交互式Shell现在是Zsh。要消除这个警告,您可以将以下命令添加到~/.Bash_profile 或 ~/.profile中:
export BASH_SILENCE_DEPRECATION_WARNING=1
如何切换到Zsh描述文件和提示符
如果您正在使用Bash描述文件(例如,为了设置环境变量、别名或路径变量),则您应改为使用作用与它相同的Zsh描述文件。例如:
.zprofile的作用与.Bash_profile相同,并且在登录时运行(包括通过SSH运行).Zshrc的作用与.Bashrc相同,并针对每个新的“终端”会话运行
如果您正在使用 .profile(一个兼容 POSIX 的描述文件),则您可以将以下命令添加到.zprofile,以便Zsh自动读取这个描述文件的设置:
`[[ -e ~/.profile ]] && emulate sh -c ‘source ~/.profile’`
另外,您无需进行任何修改,就可以将Bash描述文件中的某些设置转移到Zsh描述文件。例如,要设置环境变量,您可以使用以下命令:export MY_SETTING=1。
Zsh能够识别一组不同于Bash所能识别的提示符指定符,并且用于指定彩色输出的语法更简洁,让您无需使用复杂的ANSI转义序列。例如,下面显示了.Bash_profile中默认Bash提示符的语法:
export PS1="[\e[92;40m]\h[\e[m]:[\e[93m]\W[\e[m] \$ "
要在使用.zprofile或.Zshrc时将这个prompt提示符转换为Zsh提示符,请使用以下命令:
export PS1="%10F%m%f:%11F%1~%f $ "
请参阅Zsh man页面,以了解更多详细信息。
如何测试Shell脚本
要在 macOS Catalina 中使用与Bourne 兼容的Shell来测试脚本兼容性,您可以将/var/select/sh更改为/bin/Bash、/bin/dash或/bin/Zsh。如果您将/var/select/sh更改为Bash之外的 Shell,请注意,使用Bashisms的脚本可能无法正常工作。
您可以运行命令Zsh --emulate sh来让Zsh模拟sh。