Bash,Zsh和其他Linux Shell之间有什么区别?
大多数Linux发行版默认都包含bashshell,但是我们也可以切换到另一个Shell环境。 Zshis是一个特别受欢迎的替代方案,并且还有其他shell,例如灰烬,破折号,鱼和tcsh。但是有什么区别,为什么会有那么多呢?
shell做什么?
当我们在命令行上登录或者在Linux上启动终端窗口时,系统将启动Shell程序。 Shell提供了扩展命令行环境的标准方法。如果愿意,可以将默认shell换成另一个shell。
第一个shell环境是Thompson Shell,它是由Bell Labs开发并于1971年发布的。此后,shell环境一直以此概念为基础,并增加了许多新功能,功能和速度改进。
例如,Bash提供命令和文件名的完成,高级脚本功能,命令历史记录,可配置的颜色,命令别名以及其他各种功能,这些功能在1971年第一个Shell发行时就不可用。
各种系统服务还在后台使用该Shell。 Linux发行版包含许多作为shell脚本编写的功能。这些脚本是在shell环境中运行的命令和其他高级shell脚本功能。
导致Bash的Shell:sh,csh,tsh和ksh
现代贝壳最著名的祖先是Bourne贝壳,又名shour,以其在AT&T贝尔实验室工作的创造者Stephen Bourne命名。它于1979年发布,由于它支持命令替换,管道,变量,条件测试和循环以及其他功能,因此成为Unix中的默认命令解释器。它没有为用户提供太多自定义功能,并且不支持诸如别名,命令完成和shell函数之类的现代功能(尽管最后添加了最后一个功能)。
C shell或者csh是1970年代末由加州大学伯克利分校的Bill Joy开发的,它添加了许多交互式元素,用户可以使用它们来控制系统,例如别名(长命令的快捷方式),作业管理能力,命令历史记录等。它是使用C语言编写的,该语言是Unix操作系统本身编写的。这也意味着Bourne Shell的用户必须学习C,以便可以其中输入命令。此外,csh还有相当多的错误,很长时间以来,用户和创作者都必须解决这些错误。人们最终使用Bourne shell编写脚本,因为它可以更好地处理非交互式命令,但在正常使用时仍停留在C shell中。
随着时间的流逝,许多人在Cshell中修复了错误并添加了功能,最终导致了称为tcsh的csh的改进版本。但是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。
自1989年首次发布以来,Bash在几十年中得到了改进,但是它仍然是当今大多数Linux发行版中的默认Shell。它也是Apple macOS上的默认shell,可用于在Microsoft Windows 10上安装。
较新的shell:灰,破折号,zsh和鱼
自从这几年以来Linux社区就开始使用Bash了,但是当Bash在28年前首次发布时,开发人员并没有停止创建新的Shell。
肯尼斯·阿尔姆奎斯特(Kenneth Almquist)创建了一个伯恩(Bourne)shell克隆,称为阿尔姆奎什(Almquish)shell,贝壳,白蜡,有时也称为sh。它也与POSIX兼容,并成为BSD(Unix的另一个分支)中的默认Shell。 ashshell比bash轻巧,这使其在嵌入式Linux系统中很受欢迎。如果我们有安装了BusyBox的植根Android手机,或者安装了BusyBox软件套件的任何其他设备,则使用ash中的代码。
Debian开发了基于ash的shell环境,并将其称为dash。它被设计为符合POSIX且轻巧,因此比Bash更快,但不会具有所有功能。 Ubuntu使用破折号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派生而来。这是一个有趣的想法,但是我们通过使用鱼学到的东西不一定能使用bash和其他Bourne衍生的贝壳。
我们应该选择哪一个? (以及为什么Zsh受欢迎)
我们不需要选择shell,操作系统会为我们选择默认的shell,而该选择几乎总是bash。坐在Linux发行版甚至Mac前面,我们几乎总是拥有bash shell环境。 Bash具有许多高级功能,但是除非我们编写Shell脚本,否则我们可能不会使用它们。
在嵌入式Linux系统或者BSD系统上,我们将获得ash shell。但是ash是基于Bourne的shell,并且与bash基本上兼容。从使用bash获得的任何知识都将转移到使用ash或者dashshell,尽管此轻量级shell中不提供某些高级脚本功能。
几乎我们将遇到的每个shell都是基于Bourne的,并且包括zsh的工作方式都差不多。
这就是zsh受欢迎的原因。此更新的Shell与bash兼容,但包含更多功能。zsh shell提供了内置的拼写更正,改进的命令行完成功能,充当shell插件的可加载模块,允许我们为文件名添加别名的全局别名或者命令行上的其他任何内容,而不仅仅是命令,以及更多的主题支持。就像bash一样,但是如果我们在命令行中花费大量时间,则可能会有很多添加功能,添加功能和可配置选项,这可能会让我们感到满意。
如果我们熟悉bash,则可以在不学习其他语法的情况下切换到zsh,我们将获得其他功能。如果我们熟悉zsh,则可以在不学习其他语法的情况下切换到bash,我们将无法使用这些功能。
噢,我的ZSH是一个工具,可以更轻松地启用zsh插件并在预制主题之间切换,从而快速自定义zsh shell,而无需花费大量时间进行调整。
也有其他shell。例如,tcsh shell仍然存在并且仍然是一个选项。 FreeBSD使用tsch作为其默认的根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
或者Change Shell命令。
要使用此命令,我们首先需要使用which命令找到shell的完整路径。例如,假设我们要更改为zsh shell。我们将运行以下命令:
which zsh
在Ubuntu上,这告诉我们zsh二进制文件存储在/ usr / bin / zsh中。
运行以下命令,输入密码,系统将提示我们选择一个新的登录shell:
chsh
根据上面的命令,我们将输入/ usr / bin / zsh
。在我们运行chsh
命令并将其改回之前,zsh shell将成为我们的默认设置。