为什么bash是大多数操作系统中的默认shell?

为什么bash是大多数操作系统(Ubuntu,Fedora,OSX等)中的默认shell? 为什么许多高级用户大多使用zsh? 如果它那么好,为什么不是默认值?

我使用两者我没有看到任何差异,我的所有任务都很简单:)

我做了一些阅读,结论似乎是它是GNU的默认shell(大多数基于Linux的操作系统使用),因此只是作为GNU的一部分打包,同时还有20年的开发背后稳定而全面,它是最好的全能,满足除最先进用户之外的所有需求。

有关更多信息,请参阅Linux上为什么选择bash标准? (关于Unix和Linux的相同问题)。

只是为此添加一点,还有很多其他的shell可以尝试,如果你有兴趣,这里有一些来自这个答案 :

  • Zsh拥有更先进的交互式设施,但在编写脚本时有一些怪癖(现在比现在更少)。 在20世纪90年代早期到中期,当Linux处于起步阶段时,zsh几乎不为人知。

  • 自20世纪80年代中期以来, Ksh是商业统一的事实上的标准,但直到2000年才成为专有软件,因此在Linux上不是一个选择。 此外,与bash相比,ksh具有subpar命令行编辑function。

  • Pdksh是ksh的免费克隆版本,可能是一种选择,但它并不为人所熟知,并且命令行版本能力较差。 (Pdksh不再是一个非常活跃的项目,即使它仍然在某些BSD中使用,现在ATT ksh是免费的。)

  • 一些发行版将ash变体安装为/bin/sh 。 Ash(我的意思是任何称为灰的松散壳系列)设计得小而快,没有交互function(它仅用于编辑脚本)。 灰烬复兴相对较新; 在20世纪90年代,现有的变体缺乏很多function。

  • 在zsh出现之前, Tcsh是最先进的交互式shell,但它与sh不兼容,而且脚本编写不太好 。

Unix的AT&T分支的Bourne Shell(当天回归)被Korn Shell改进并取代了ksh 。 ksh也来自AT&T贝尔实验室而不是GPL(当前版本是Eclipse Public License)。 C-shell, csh来自Berkeley版本的Unix,也不是GPL(BSD许可证),也使用了与sh不同的语法。 Z-shell, zsh是对sh的改进,但不是GPL(类似MIT的许可证)。 Bash是对sh的改进,使用了GPL和GNU。 仅凭许可证,Bash可能是GPL操作系统的选择。 特别是shell是发行版的核心部分。

但是Bash也是一个GNU项目,我认为,它比Berkeley Unix或AT&T Unix的遗留产品更容易开发和贡献。 一个非常好的案例可以说zsh是比Bash更好的shell,但还不足以克服它的不同许可和非GNU项目状态。

当Linux发行版首次出现并选择他们的默认shell(90年代早期到中期)时,没有github(2008)甚至是SourceForge(1999)。 那时候,我认为GNU项目比非GNU项目在获得关注和绘图以及包括新开发人员方面具有真正的优势。 因此发行版可以将Z-shell视为更好,但也期望Bash将获得更好的支持和维护,并且还会添加更多function,使其能够赶上zsh。

既然Bash已经有多年的默认状态,那么它就成了事实上的标准,并且有关于它的书籍。 有一本书涵盖了Bash和Z-shell ,但没有一本书专门涵盖它,而有多本书为Bash这样做。

此时,如果发行版要更改现有系统升级的默认值,则会破坏设置,因为某些初始化文件具有不同的名称(例如.bashrc与.zshrc),并且文件的内容可能具有不兼容的语法。 因此他们非常不愿意这样做,留下新的下载将zsh作为默认值并升级为bash。 同一个发行版的两个不同默认值是他们可能不希望支持的内容,用户/公司也不想处理它们。

Unix shell语言都很难看。 有些特别( csh ),有些可能少一些( ksh ?我实际上并不知道),但实际上当谈到大项目的可读性和刚性等方面时,它们都不能接近精心设计的通用语言例如Python,C#或Haskell。 所以,当你想要坚实的东西时,你永远不会选择任何贝壳口味。

当你想快速完成简单的工作时,你可以选择它们。 为此,您需要:

  • 简洁的语法和足够的一致性,因此您可以实际记住它(很难查找速记运算符)。 如果你的shell安装在任何地方都很重要,因为你真的宁愿不记住这些kluge怪物中的一个以上。
  • 良好的交互function,因此您可以直接进入终端并使工作无需在多个脚本文件之间切换。
  • 能够从任何地方获取任何脚本片段并使其正常工作。 sh兼容性在这里是一个很大的优点,再一次越流行越好。

所以你看,流行语在这些shell语言中比在通用语言中更重要。 因此,即使ksh本身作为一种语言有点“更好”,如果bash只是更受欢迎(在相关领域,因为它首先被选为GNU的默认值。

进行切换的人是有意识的,并且经验足以轻松切换到他们喜欢的shell。 OTOH,一个被迫与不太受欢迎的shell合作的新手,如果他们向互联网询问某些内容并且无效,他们很快就会感到困惑。 因此,任何不仅针对Unix退伍军人的发行版都会冒很大的风险,如果它除了bash标准之外什么都不做,这是相对较少的人会受益(而且只是一点点)的一个步骤。

  1. 它需要的时候就在那里
  2. 它有足够的眼睛糖果,开始用户可以花一周时间定制他们的提示。
  3. 常见的用例就足够了(最常见的是启动一个命令)
  4. 如果perl不够好,python和lua可以占用空间。
  5. perl是一个可怕的交互式shell
  6. 虽然fish,ksh或zsh在理论上可能是一个更好的shell,但是当perl工作得很好或者可移植性是一个问题时,我没有足够的改进,所以我无论如何都要针对破坏。

“临界质量”是IMO的主要答案。 Bash不只是用于命令行工作,而是用于编写脚本,并且有大量的Bash脚本。 无论现在用于交互的替代方案有多好,只需“即插即用”这些脚本的能力就超过了这些优势。 因此,现在唯一可以实际取消Bash的shell是一个完全向后兼容的shell,最有可能的候选者是……下一个版本的Bash。