Bash、Zsh 和其他 Linux Shell 之间有什么区别?

已发表: 2022-01-29

大多数 Linux 发行版默认包含 bash shell,但您也可以切换到另一个 shell 环境。 Zsh 是一个特别受欢迎的替代方案,还有其他 shell,如 ash、dash、fish 和 tcsh。 但是有什么区别,为什么有这么多?

贝壳有什么作用?

当您在命令行登录或在 Linux 上启动终端窗口时,系统会启动 shell 程序。 Shell 提供了一种扩展命令行环境的标准方法。 如果您愿意,可以将默认外壳换成另一个外壳。

第一个 shell 环境是 Thompson Shell,由贝尔实验室开发并于 1971 年发布。从那时起,Shell 环境一直在构建这一概念,添加了各种新特性、功能和速度改进。

例如,Bash 提供了命令和文件名补全、高级脚本功能、命令历史记录、可配置颜色、命令别名以及 1971 年第一个 shell 发布时不可用的各种其他功能。

shell 也被各种系统服务在后台使用。 Linux 发行版包括许多编写为 shell 脚本的函数。 这些脚本是通过 shell 环境运行的命令和其他高级 shell 脚本功能。

导致 Bash 的 Shell:sh、csh、tsh 和 ksh

相关:什么是 Unix,它为什么重要?

现代 shell 最突出的祖先是 Bourne shell(也称为“sh”),它以其在 AT&T 贝尔实验室工作的创始人 Stephen Bourne 的名字命名。 它于 1979 年发布,成为 Unix 中的默认命令解释器,因为它支持命令替换、管道、变量、条件测试和循环以及其他功能。 它没有为用户提供太多的定制,也不支持像别名、命令完成和 shell 函数这样的现代细节(尽管最后一个被添加了)。

广告

C shell 或“csh”由加州大学伯克利分校的 Bill Joy 在 1970 年代后期开发。 它添加了许多交互元素,用户可以使用这些元素控制他们的系统,例如别名(长命令的快捷方式)、作业管理能力、命令历史记录等等。 它以 C 编程语言为模型,Unix 操作系统本身就是用这种语言编写的。这也意味着 Bourne shell 的用户必须学习 C 才能在其中输入命令。 此外,csh 有相当多的 bug 需要用户和创作者在很长一段时间内敲定。 人们最终将 Bourne shell 用于脚本,因为它可以更好地处理非交互式命令,但在正常使用时仍坚持使用 C shell。

随着时间的推移,许多人修复了 C shell 中的错误并添加了特性,最终形成了一个改进的 csh 版本,称为“tcsh”。 但是 csh 仍然是基于 Unix 的计算机的默认设置,并且添加了一些非标准功能。 贝尔实验室的 David Korn 致力于 KornShell 或“ksh”,它试图通过向后兼容 Bourne shell 的语言但添加 csh shell 的许多功能来改善这种情况。 它于 1983 年发布,但在专有许可下。 直到 2000 年代,它才成为自由软件,当时它是在各种开源许可下发布的。

bash 的诞生

用于 Unix 的便携式操作系统接口或 POSIX 是对繁忙的专有 csh 实现的另一种回应。 它成功地创建了命令解释标准(除其他外),并最终反映了 KornShell 中的许多功能。 与此同时,GNU 项目试图创建一个免费的、与 Unix 兼容的操作系统。 GNU 项目开发了一个自由软件 shell 作为其自由操作系统的一部分,并将其命名为“Bourne Again Shell”或“bash”。

Bash 自 1989 年首次发布以来的几十年里一直在改进,但它仍然是当今大多数 Linux 发行版的默认 shell。 它也是 Apple macOS 上的默认 shell,可在 Microsoft 的 Windows 10 上安装。

较新的 Shell:ash、dash、zsh 和 fish

虽然此后几年 Linux 社区已经选择了 Bash,但在 28 年前 Bash 首次发布时,开发人员并没有停止创建新的 shell。

广告

Kenneth Almquist 创建了一个 Bourne shell 克隆,称为 Almquish shell、A Shell、“ash”,或者有时只是“sh”。 它也与 POSIX 兼容,并成为 BSD(Unix 的一个不同分支)中的默认 shell。 ash shell 比 bash 更轻量,这使得它在嵌入式 Linux 系统中很流行。 如果你有一个安装了 BusyBox 的 Android 手机——或者任何其他安装了 BusyBox 软件套件的设备——它使用的是来自 ash 的代码。

Debian 开发了一个基于 ash 的 shell 环境,并称之为“dash”。 它被设计为兼容 POSIX 且轻量级,因此它比 Bash 更快,但不会拥有它的所有功能。 Ubuntu 使用 dash shell 作为非交互式任务的默认 shell,加速 shell 脚本和其他在后台运行的任务。 然而,Ubuntu 仍然使用 bash 作为交互式 shell,因此用户仍然拥有全功能的交互式环境。

最受欢迎的新 shell 之一是 Z shell,或“zsh”。 zsh 由 Paul Falstad 于 1990 年创建,是一个 Bourne 风格的 shell,它包含您在 bash 中可以找到的功能,甚至更多。 例如,zsh 具有拼写检查、监视登录/注销的能力、一些内置的编程功能(如字节码)、支持科学记数法的语法、允许浮点运算等功能。

另一个较新的 shell 是 2005 年发布的 Friendly Interactive Shell 或“fish”。它具有独特的命令行语法,旨在更容易学习,但不是从 Bourne shell 或 C shell 派生的。 这是一个有趣的想法,但是您通过使用 fish 学到的东西并不一定会帮助您使用 bash 和其他 Bourne 派生的 shell。

你应该选择哪个? (以及为什么 Zsh 很受欢迎)

您无需选择外壳。 您的操作系统会为您选择默认 shell,而该选择几乎总是 bash。 坐在 Linux 发行版(甚至是 Mac)前,您几乎总会拥有一个 bash shell 环境。 Bash 有很多高级功能,但除非您编写 shell 脚本,否则您可能不会使用它们。

在嵌入式 Linux 系统或 BSD 系统上,您最终会得到 ash shell。 但是 ash 是基于 Bourne 的 shell,并且在很大程度上与 bash 兼容。 您从使用 bash 获得的任何知识都将转移到使用 ash 或 dash shell,尽管此轻量级 shell 中不提供一些高级脚本功能。

广告

您将遇到的几乎每个 shell 都是基于 Bourne 的,并且工作方式类似——包括 zsh。

这就是 zsh 受欢迎的原因。 这个较新的 shell 与 bash 兼容,但包含更多功能。 zsh shell 提供内置的拼写更正、改进的命令行补全、充当 shell 插件的可加载模块、全局别名,允许您在命令行上为文件名或其他任何内容命名,而不仅仅是命令,以及更多主题支持。 它就像 bash,但如果您在命令行上花费大量时间,您可能会喜欢它有很多额外功能、附加功能和可配置选项。

如果您熟悉 bash,则无需学习其他语法即可切换到 zsh — 您只会获得额外的功能。 如果您熟悉 zsh,则无需学习其他语法即可切换到 bash — 您将无法访问这些功能。

“Oh My ZSH”是一个工具,可以帮助您更轻松地启用 zsh 插件并在预制主题之间切换,快速自定义您的 zsh shell,而无需花费数小时进行调整。

还有其他贝壳。 例如,tcsh shell 仍然存在并且仍然是一个选项。 FreeBSD 使用 tsch 作为其默认的 root shell,并使用 ash 作为其默认的交互式 shell。 如果您经常使用 C 编程,tsch 可能更适合您。 但是,它远没有 bash 或 zsh 那样常用。

如何在 shell 之间切换

切换到新的 shell 来试用它很容易。 只需从 Linux 发行版的包管理器中安装 shell,然后键入命令来启动 shell。

广告

例如,假设您想在 Ubuntu 上试用 zsh。 您将运行以下命令进行安装,然后启动它:

 sudo apt install zsh

zsh

然后,您将坐在 zsh shell 中。 在 shell 中键入“ exit ”以离开它并返回到您当前的 shell。

这只是暂时的。 每当您打开新的终端窗口或在命令行登录系统时,您都会看到您的默认 shell。 要更改登录时看到的 shell(称为登录 shell),通常可以使用chsh或“更改 shell”命令。

要使用此命令,您首先需要使用 which 命令找到 shell 的完整路径。 例如,假设我们想更改为 zsh shell。 我们将运行以下命令:

 哪个zsh

在 Ubuntu 上,这告诉我们 zsh 二进制文件存储在 /usr/bin/zsh。

运行以下命令,输入您的密码,系统将提示您选择一个新的登录 shell:

 chsh
广告

根据上面的命令,我们输入/usr/bin/zsh 。 然后 zsh shell 将成为我们的默认值,直到我们运行chsh命令并将其改回。