苹果的 shell:什么时候 bash 迁移到 Zsh

354 阅读4分钟

Zsh Merch Designs

Zsh Merch Designs by ZshCC BY-SA 4.0

2019 年,在 macOS 10.15 Catalina 版本中苹果宣布 使用 Zsh 作为默认的 shell

zsh(我相信它的发音是zee-shell,尽管zish说起来很有趣)即将成功取代 bash作为默认的 shell。bash 自 Mac OS X 10.3 Panther 以来一直是默认 shell。

为什么?

macOS 默认的 shell —— bash 已经停留在 3.2 版本很长时间了,但最新的 bash v5 在 2019 年 1 月就已经发布了。

bash --version

这是因为 bash v3 使用的是 GPL v2 证书, 苹果没有切换到这些较新版本的原因是版本大于 3 的 bash 使用的是 GPL v3 证书。而 v3 对比 v2 实在是过于严格了。

而另一方面,zsh 拥有 MIT 的许可证,这使得苹果更愿意将其默认包含在系统中。zsh 已经在 macOS 上可用了很长时间。macOS 10.14 Mojave 上的 zsh 版本相当新 (5.3)。macOS 10.15 Catalina 的 zsh 版本为 5.7.1

bash 不见了!?

并不是这样,实际上 macOS 提供很多个 shell,查看 Mac 自带的 shell 的命令为 cat /etc/shells,结果如下:

image.png

macOS Catalina 的 bash 仍然和更早的 macOS 版本相同(版本 3.2.57),所以即使当您升级到 Catalina 时,用户的 bash shell 将保持原样。

有时候当你打开终端可能就会收到如下提示:

$ /bin/bash
The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.

想要禁用此提示,可以在 $HOME/.bash_profile$HOME/.profile$HOME/.bashrc 添加如下内容重启终端。

export BASH_SILENCE_DEPRECATION_WARNING=1

您也可以自己下载并安装更新版本的 bash。请记住,自定义 bash 安装位于不同的目录中,通常是/usr/local/bin/bash

bash 会无限期保留吗?

历史上苹果也换过 shell,比如 2005 的 Mac OS X 10.3 Panther 版本把默认 shell 由 tcsh 切换为 bash,苹果并不真正关心您是否继续使用 tcsh

虽然如此,但是 tcsh 在 macOS 上仍然存在。

macOS Catalina 上还出现了一个新的 shell。'Debian Almquist Shell' dash 已被添加到 shell 阵容中。 dash 被设计为 Posix 标准 shell sh 的最小实现。到目前为止,在 macOS(包括 Catalina)中, sh 在 sh 兼容模式下调用 bash 。

所有这些变化都是苹果准备在未来某个但不确定的时间删除 /bin/bash

我需要等待 Catalina 切换到 zsh 吗

不需要,本质上 zsh 就是个软件,只要电脑上有没有自己装个就可以开始测试 zsh 甚至切换默认 shell。

如果你只想看看它是如何 zsh 工作的,你可以打开终端并输入 zsh

$ zsh
MacBook%

您将看到的主要变化是提示看起来有所不同。zsh使用该%字符作为默认提示。(当然,您可以更改它。)大多数导航击键和其他行为将与bash

如果您已经想将默认 shell 切换为zsh可以使用以下chsh命令:

$ chsh -s /bin/zsh

这将提示您输入密码。此命令不会更改当前的 shell,而是所有新的 shell,因此请关闭当前的终端窗口和选项卡并打开一个新的。

zsh 有何不同?

与 bash ('Bourne again shell')一样, zsh 源自 'Bourne' 家族的 shell。由于这种共同的祖先,它在日常使用中表现非常相似。最明显的变化将是不同的提示。

bash 和 zsh 之间的主要区别在于配置。由于 zsh 忽略了 bash 配置文件( .bash_profile 或 .bashrc ),因此您不能简单地将自定义的 bash 设置复制到 zsh 。 zsh 有更多选项和点来更改 zsh 配置和行为。有一个完整的配置工具和主题生态系统,称为 oh-my-zsh,非常受欢迎。

zsh 还为自动完成提供了更好的配置,这比 bash 中容易得多。

脚本呢?

由于 zsh 在 macOS 上已经存在了很长时间,因此您可以立即开始将脚本从 bash 移动到 zsh ,而不会失去向后兼容性。只需记住将脚本中的 shebang 设置为 #!/bin/zsh,为了更好的兼容性,使用 /bin/sh 作为 shebang。也是一个不错的选择。

您将获得 zsh 中 bash v3 不存在的一些功能,例如数组和关联数组(字典)。

概括

总的来说,虽然来自苹果的信息非常有趣,但变化本身不如头条新闻那么引人注目。苹果并没有使用 zsh 取代 bash,至少现在还没有。总的来说,我们将不得不重新思考和重新学习一些东西,但最终从一个十年前的 shell 切换到一个新的现代 shell 也有很多收获!

参考