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
。