在2019年macOS推出了Catalina版本,在这个版本中zsh取代了bash作为缺省的shell,虽然据坊间推测这个与bash 3.2之后已经基于GPL v3协议有关(macOS的bash 3.2基于GPL v2)。对于诸如分屏和定制化的终端不能满足日常操作需要的用户,将目光转向了tmux等终端分屏器,其实zsh也是一个很不错的选择,尤其在定制个性化的终端显示上,社区还有很多扩展的主题比如oh-my-zsh可以直接拿来即用。这篇文章介绍一下在CataLina下从Bash转向zsh的一些基础知识。
Catalina版本之下,zsh会被缺省安装,而且会提示zsh将会成为缺省的shell。
liumiaocn:~ liumiao$ sw_vers ProductName: Mac OS X ProductVersion: 10.15.2 BuildVersion: 19C57 liumiaocn:~ liumiao$zsh版本
liumiaocn:~ liumiao$ zsh --version zsh 5.7.1 (x86_64-apple-darwin19.0) liumiaocn:~ liumiao$操作系统支持的shell
操作系统支持的shell可以从/etc/shells中进行确认,比如Catalina中如下所示:
liumiaocn:~ liumiao$ cat /etc/shells # List of acceptable shells for chpass(1). # Ftpd will not allow users to connect who are not using # one of these shells. /bin/bash /bin/csh /bin/dash /bin/ksh /bin/sh /bin/tcsh /bin/zsh liumiaocn:~ liumiao$
可以看到除了bash、csh之外,zsh也是支持之列。
提示警示信息
当macOS升级至Catalina之后,再次登录之后会提示“The default interactive shell is now zsh”(缺省交互的shell现在已经是zsh)。
Catalina版本中缺省会安装zsh,如果是之前的版本的OSX,则可以使用如下命令进行:
安装命令(OSX):homebrew install zsh
安装命令(CentOS):yum install -y zsh
安装命令(Ubuntu):apt-get install -y zsh
Catalina升级的影响
升级至Catalina,虽然缺省的shell已经变成了zsh,但是在这个版本目前并不会直接影响用户的使用,可以看到虽然有提示信息,但是缺省的脚本仍然是Bash
而终端的缺省的Preferences菜单项的显示也如下所示(/bin/bash)
zsh是兼容Bash的,而且zsh中还提供了Bash的兼容模式,而且shell如果是符合POSIX标准的情况下,理论上来说应该是无视这其中的区别的。在后续的文章中将进一步展开介绍。
Bash到zsh 转变方法输入chsh -s /bin/zsh即可从Bash转变为zsh
liumiaocn:~ liumiao$ chsh -s /bin/zsh Changing shell for liumiao. Password for liumiao: liumiaocn:~ liumiao$
重新打开终端之后显示信息如下所示:
liumiao@liumiaocn ~ % echo $SHELL /bin/zsh liumiao@liumiaocn ~ %影响事项
需要注意的是之前在.bash_profile需要重新设定到zsh中,不然一定会有影响。比如之前的环境中有Angular的nvm的设定,在Bash下能够正常动作
liumiaocn:~ liumiao$ echo $SHELL /bin/bash liumiaocn:~ liumiao$ ng --version _ _ ____ _ ___ / \ _ __ __ _ _ _| | __ _ _ __ / ___| | |_ _| / △ \ | '_ \ / _` | | | | |/ _` | '__| | | | | | | / ___ \| | | | (_| | |_| | | (_| | | | |___| |___ | | /_/ \_\_| |_|\__, |\__,_|_|\__,_|_| \____|_____|___| |___/ Angular CLI: 8.3.8 Node: 10.15.3 OS: darwin x64 Angular: ... Package Version ------------------------------------------------------ @angular-devkit/architect 0.803.8 @angular-devkit/core 8.3.8 @angular-devkit/schematics 8.3.8 @schematics/angular 8.3.8 @schematics/update 0.803.8 rxjs 6.4.0 liumiaocn:~ liumiao$
而切换至zsh之后,则无法正常找到
liumiao@liumiaocn ~ % echo $SHELL /bin/zsh liumiao@liumiaocn ~ % which ng ng not found liumiao@liumiaocn ~ %
可根据需要修改.zshrc文件(如果没有Bash特定的设定,比如Bash补全的设定方法等,只是一些export命令或者一些通用的shell脚本,基本可以直接拷贝至.zshrc文件中),此处示例中使用的环境中使用此种方法设定之后,重新打开终端发现之前的环境已经可以正常运行了
liumiao@liumiaocn ~ % echo $SHELL /bin/zsh liumiao@liumiaocn ~ % which ng /Users/liumiao/.nvm/versions/node/v10.15.3/bin/ng liumiao@liumiaocn ~ % ng --version _ _ ____ _ ___ / \ _ __ __ _ _ _| | __ _ _ __ / ___| | |_ _| / △ \ | '_ \ / _` | | | | |/ _` | '__| | | | | | | / ___ \| | | | (_| | |_| | | (_| | | | |___| |___ | | /_/ \_\_| |_|\__, |\__,_|_|\__,_|_| \____|_____|___| |___/ Angular CLI: 8.3.8 Node: 10.15.3 OS: darwin x64 Angular: ... Package Version ------------------------------------------------------ @angular-devkit/architect 0.803.8 @angular-devkit/core 8.3.8 @angular-devkit/schematics 8.3.8 @schematics/angular 8.3.8 @schematics/update 0.803.8 rxjs 6.4.0 liumiao@liumiaocn ~ %