Bash、Zsh和其他Linux shell有什么不同?

默认情况下,大多数Linux发行版都包含了bash的shell,但是您也可以切换到另一个shell环境。zsh是一种特别流行的替代方案,还有其他shell,如ash、dash、fish和tcsh。但是有什么不同呢?为什么会有这么多呢?

贝壳能做什么?

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

第一个Shell环境是由Bell Labs开发并于1971年发布的Thompson Shell。从那时起,Shell环境一直建立在这个概念的基础上,添加了各种新的特性、功能和速度改进。

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

外壳还在后台由各种系统服务使用。Linux发行版包含许多以shell脚本编写的函数。这些脚本是在shell环境中运行的命令和其他高级shell脚本函数。

通向Bash的shell:sh、csh、tsh、和ksh

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

现代贝壳最著名的前身是伯恩贝壳,也被称为“sh”,它是以其创建者斯蒂芬·伯恩的名字命名的,他曾在AT&T的贝尔实验室工作。1979年发布的它成为Unix中的默认命令解释器,因为它支持命令替换、管道、变量、条件测试和循环以及其他功能。它没有为用户提供太多定制,也不支持别名、命令完成和shell功能等现代细节(尽管最后添加了这项功能)。

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

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

狂欢的诞生

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

自1989年首次发布以来,Bash已经改进了几十年,但它仍然是今天大多数Linux发行版的默认shell。它也是苹果MacOS的默认外壳,可以安装在微软的Windows10上。

较新的shell:hash、dash、zsh和fish

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

Kenneth Almquist创造了一个伯恩壳的克隆,被称为Almquish shell,A Shell,“ash”,有时也就是“sh”。它也与POSIX兼容,并成为Unix的另一个分支BSD中的默认shell。ash shell比bash更轻量级,这使得它在嵌入式Linux系统中很流行。如果你有一部安装了BusyBox的带根的Android手机-或者任何其他安装了BusyBox套装软件的设备-它使用的是来自ash的代码。

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

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

另一个较新的外壳是友好的交互式外壳,或称“鱼”,于2005年发布。它有一个独特的命令行语法,旨在更容易学习,但不是从Bourne shell或C shell派生出来的。这是一个有趣的想法,但是您通过使用Fish学到的知识不一定会帮助您使用bash和其他从Bourne派生的shell。

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

你不需要选择shell。你的操作系统会为你选择默认的shell,而这个选择几乎总是bash。坐在Linux发行版-甚至是Mac-前面,您几乎总是会有一个bash shell环境。Bash有相当多的高级特性,但是除非您编写shell脚本,否则您可能不会使用它们。

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

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

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

如果您熟悉bash,您可以切换到zsh,而不需要学习不同的语法-您只会获得额外的特性。如果您熟悉zsh,则无需学习不同的语法就可以切换到bash-您只是无法访问这些特性。

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

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

如何在外壳之间切换

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

例如,假设您想在Ubuntu上尝试使用zsh。您需要运行以下命令来安装并启动它:

sudo apt install zsh zsh

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

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

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

which zsh

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

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

chsh

根据上面的命令,我们将输入/usr/bin/zsh。在我们运行chsh命令并将其改回之前,zsh shell将一直是我们的默认设置。

相关文章