Mac终端的Zsh与Bash区别


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一样持续提示你需要继续输入,只用连续敲击两次TABZsh给你一个补全目录,让你来进行选择。

在 Mac 上将Zsh用作默认Shell

macOS Catalina 版开始,您的 Mac 将使用Zsh作为默认登录Shell和交互式Shell。您还可以在较低版本的 macOS 中将Zsh设置为默认Shell

默认情况下,您的 Mac 使用ZshBash作为登录Shell和交互式Shell的命令行解释器:

  • macOS Catalina 版开始,Zsh (Z shell) 是所有新建用户帐户的默认Shell
  • BashmacOS Mojave 及更低版本中的默认Shell
  • ZshBourne 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


文章作者: 弈心
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 弈心 !
评论
  目录