Bash shell 已经有 30 多年的历史了,而且仍然很强大。它有什么作用,它从哪里来,为什么它仍然是 Linux 系统上最常见的 shell?
什么是壳?
当您打开终端窗口并键入命令时,必须执行某些操作,获取您输入的内容,弄清楚您的意图,并运行您要求的任务。执行此操作的软件是外壳。shell 是一个命令解释器。它会扫描您输入的内容并挑选出命令、目录名、文件名和程序名,以便确定您要实现的目标。
人们经常交替使用短语“终端窗口”、“命令行”和“shell”,但它们是三个不同的东西。终端窗口是物理电传终端的软件表示。它为您提供与计算机的连接。为了做任何有用的事情,您必须能够在命令行中输入指令。命令行由 shell 提供,终端窗口允许您访问 shell。
Shell 还允许您将一组命令打包到一个称为脚本的文本文件中。每次运行脚本时,脚本中的所有命令都会为您执行。脚本提供了效率、可重复性和便利性。
第一个 Unix shell 是 Thompson shell,称为sh
. 它由Ken Thompson编写 ,他可能是贝尔实验室最初的 Unix 创始人中最重要的成员 。Thompson shell 被用作默认的 Unix shell,直到并包括 Unix 版本 6。它 在 1979 年被 Unix 版本 7 中的Bourne shell取代 。
伯恩壳
由Stephen Bourne编写的 Bourne shell 是 Thompson shell 的升级替代品。它甚至开始使用与 Thompson shell 相同的命令sh
,以保持与现有脚本的向后兼容性。向后兼容性很重要,但包含的新功能提供了我们今天仍在使用的许多功能。
Bourne shell 是一种交互式 shell 和一种脚本语言。它支持前台和后台任务执行和基本作业控制。添加了管道和重定向,并改进了处理循环。
shell 现在包含一些内置命令,这意味着它不需要将所有内容都传递给外部实用程序,从而提高了效率。Bourne shell 甚至支持“here documents”,这是一种自动将数据发送到命令的优雅方式。
Bourne 炮弹提高了标准并成为了新标准。
Bash 的诞生
1984 年,当 GNU 项目 宣布打算制作一个免费的 Unix 克隆版本时——从头开始编写并使用 新的、宽松的许可——团队需要一个 shell。当一名一直在为 GNU 项目开发 shell 的志愿者一再无法交付任何东西时, Brian Fox 的 任务是编写 Bourne shell 的克隆。
它被称为 Bourne Again Shell或 Bash。这部分是为了向斯蒂芬伯恩致敬,部分是为了它而玩文字游戏。在 1989 年发布之后, Chet Ramey 为 Bash 贡献了一些错误修复。他最终成为 Bash shell 的共同维护者。如今,他仍然是 Bash 项目的维护者。
Linus Torvalds的,Linux内核的创始人,曾表示,前两个方案,他在1991年跑了他的新的内核是Bash和gcc
, GNU的编译器。GNU 实用程序与 Linux 内核的配对是互惠互利的。GNU 操作系统需要一个内核,而 Linux 内核需要构成 Unix 克隆的所有其他东西。
因为 Bash 是标准的 GNU shell,所以它成为了所有 GNU/Linux 发行版上的标准 shell。Linux 蓬勃发展到如今它支撑着现代世界的 惊人数量。Bash shell 也掀起了那股成功浪潮。
Bash 合并并改进了 Bourne shell 的功能集,但它也从其他 shell 中汲取灵感,例如 C shell ( csh
) 和 KornShell ( ksh
)。例如,将波浪号“ ~
”扩展为$HOME
环境变量中保存的值来自 C shell,而fc
在命令历史记录中调用默认编辑器的命令来自 KornShell。
Bash 引入了配置文件,例如“.bashrc”和“.bash_profile”文件。Bash 上的命令行编辑远远超过了以前的 shell。命令历史中先前执行的命令的操作是 C shell“爆炸历史”功能的改进版本。大括号扩展是 Bourne shell 中缺少的一个特性,它在 Bash 中实现为 C shell 中功能的超集。数组通过删除它们的大小限制得到了改进。命令提示符中的参数扩展允许用户自定义他们的 Bash 提示符。
Bash shell 旨在符合 POSIX P1003.2/ISO 9945.2 Shell 和实用程序 标准。
为什么 Bash 仍然重要
如果 Bash 不能胜任这项工作,它就不可能持续这么长时间——超过 30 年——作为默认的 Linux shell。Bash由于其使用寿命长和庞大的用户群,成熟且非常稳定。有许多可供选择的 shell,从 C shell 和 KornShell 等老手到 Z shell ( zsh
)和 Friendly Interactive Shell ( fish
)等较新的 shell 。Z shell 和 Fish shell 都具有 Bash 没有的一些功能,并且可以说是实现与 Bash 相同的某些功能的更好方法。那么为什么 Bash 仍然是占主导地位的 shell?
在我被要求管理的所有 Linux 机器中,我不记得有一台没有 Bash 作为 shell。Unix 机器,是的,但 Linux 机器,不是。每次都是Bash。这种熟悉使您可以快速开始工作并立即发挥作用。您已经了解 Bash,因此没有学习曲线。你不会因为语法上的微小差异而陷入困境,因为你会绕圈子试图找出为什么某些东西不起作用。花在弄清楚这个 外壳上的咒语应该是什么的 时间是死时间,所以使用众所周知的和广泛使用的外壳符合客户业务的利益。
对于许多 Linux 发行版来说,使用符合 POSIX 标准的 shell(或正在努力使其成为)很重要,但更重要的是与以前版本的兼容性。进行可能破坏现有脚本的更改显然没有吸引力。有吸引力与否,有时,你只需要咬紧牙关。1967 年 9 月 3 日,瑞典从左侧驾驶改为右侧驾驶。凌晨 4 点 50 分,所有车辆都不得不停下来,慢慢地开到路的另一边,再次停下来。凌晨 5:00,交通可以继续进行,现在每个人都靠右行驶。
Bash 会被取代吗?
现在看来不可思议的事,以后可能会发生。除非我们坚持认为我们都会使用 Bash 直到世界末日,否则事实很可能是有一天,Bash 将被替换为默认的 Linux shell——无论它是否仍然是 GNU 标准 shell。或者它可能是 Bash,但其增强程度远远超出了我们今天使用的 shell。但是,无论取代今天的 Bash 的位置是什么,要么必须完全(或几乎)向后兼容,要么值得进行剧变,无论有什么好处。
这并非没有先例。自10.15版的MacOS的苹果已降至Bash和采用的Z shell作为默认的shell。Apple 在 GNU 通用公共许可证 (GPL) v.3 方面存在问题。不幸的是,这是 Bash 使用的许可证。在 GPL v.2 下发布的最新 Bash 版本是 2007 年的 3.2 版。当前版本是 5.1。苹果落后了将近十五年。Apple 可以在不迁移到 GPL v.3 的情况下包含最新外壳的唯一方法是完全迁移到不同的外壳。对苹果来说,这值得剧变。(但是,如果您愿意,您仍然可以在 macOS 上切换回 Bash!)
高级用户的工作站和您必须通过 SSH 连接远程管理的业务线 Linux 服务器之间存在天壤之别。在近 150 万台 Amazon EC2 托管服务器中,超过 93% 运行 Linux。几乎 75% 的 Web 服务器都运行 Linux。Red Hat、Amazon 和 Google 等组织在内部使用 Linux。
很难想象一个新的外壳可以提供什么好处来证明这种全球动荡是合理的。这就是 Bash 被固定到位的原因。
甚至 Microsoft 现在也提供了一种在 Windows 10 上运行基于 Linux 的 Bash shell 的方法!
未经允许不得转载:表盘吧 » 什么是 Bash Shell,为什么它对 Linux 如此重要?