为什么bash在大多数操作系统中是默认外壳?


38

为什么bash在大多数操作系统(Ubuntu,Fedora,OSX等)中是默认外壳?为什么许多高级用户大多使用zsh?如果这么好,为什么不是默认值呢?

我都使用了,我的所有任务都很简单:)


5
一切都是高斯曲线:如果确实是大多数高级用户使用ksh,那么大多数人使用不同的外壳也是正确的,这本身就可以解释为什么ksh不是默认外壳。但是我不认为这是原因,让我们等待一些肯定的回答,我相信这个问题将会收到。
kos 2015年

1
实际上,我相信ubuntu使用破折号作为默认外壳...
Bakuriu 2015年

1
这是一个很好的答案,我投票我们将其保留为开放状态。
塞斯(Seth)2015年

Answers:


33

我对此进行了一些阅读,得出的结论似乎是它是GNU的默认外壳(大多数基于Linux的操作系统使用的),因此只是作为GNU的一部分打包了,同时还具有20年的开发使其成为GNU的一部分。稳定且全面,它是最全面的工具,可以满足除最高级用户以外的所有用户的需求。

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

只是为此添加了更多内容,还有许多其他的shell可以尝试,如果您感兴趣的话,请从以下答案中获取一些内容

  • Zsh具有更高级的交互功能,但是在脚本编写方面有一些古怪之处(现在还不及以前)。在1990年代初至Linux初期,zsh几乎是未知的。

  • KSH是自上世纪80年代中期商用Unix系统的事实标准,但它是专有软件,直到2000年,所以没有在Linux上的一个选项。而且,与bash相比,ksh具有低于标准的命令行编辑功能。

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

  • 一些发行版将ash变体安装 为 /bin/sh。Ash(我的意思是指称为ash的任何松散的shell系列)被设计为体积小,速度快,没​​有交互功能(仅用于编辑脚本)。灰烬复兴是相对较新的。在1990年代,现有的变体缺乏很多功能。

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


1
当您从其他地方复制粘贴内容时,应该清楚地表明是这种情况。
muru

1
@muru我确实提供了原始帖子的链接,但我认为您的观点可能更清晰。
Mark Kirby 2015年

zsh在脚本编写方面有一些怪癖,您的评论来源是什么?没关系,我看到评论来自其他地方。
踏板车

1
您也有(与sh语法不兼容)。
Lao Lam

1
您能解释一下Korn Shell编辑的不足之处吗?即使在90年代,对我来说似乎总是可以正常工作。
Jonathan Leffler

9

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

但是Bash还是一个GNU项目,我认为它比Berkeley Unix或AT&T Unix的遗留产品为它提供了更积极的开发和更轻松的贡献。可以很好地证明zsh比Bash更好,并且已经成为更好的shell,但不足以克服zsh的不同许可证和非GNU项目状态。

早在Linux发行版首次出现并选择其默认外壳时(到90年代中期),就没有github(2008)或SourceForge(1999)了。到那时,我认为GNU项目在吸引和吸引新开发人员以及吸引新开发人员方面比非GNU项目具有真正的优势。因此发行人可以将Z-shell视为更好的产品,但也希望Bash能够获得良好的支持和维护,并且还添加了更多功能,使其可以赶上zsh。

既然Bash拥有多年的默认状态,它已成为事实上的标准,并撰写了有关它的书籍。有一本书涵盖了Bash和Z-shell,但是没有一本书专门介绍了Bash,而有很多书涵盖了Bash。

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


1

Unix shell语言都很丑陋。特别是(csh),有些可能少一些(ksh?我实际上不知道),但实际上,在涉及大型项目的可读性和刚性等方面时,它们都无法接近精心设计的通用语言,例如Python,C#或Haskell。因此,当您想要固体时,您将永远不会选择任何一种带壳口味。

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

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

因此,您会发现,与通用语言相比,在这些Shell语言中,普及是一个更大的问题。因此,即使ksh它本身是一种“更好”的语言,但如果它bash更受欢迎(实际上在相关领域,因为它首先被选为默认语言),使用它的话并没有太多优势。对于GNU)。

进行切换的人员都非常刻意,并且经验丰富,可以轻松地切换到自己喜欢的外壳。OTOH,一个被迫使用不太流行的外壳的菜鸟,如果他们向互联网索要东西,但它却无法正常工作,将很快感到困惑。因此,任何发行版不仅针对Unix老手,如果发行bash除标准之外的其他任何东西,都将冒相当大的风险,这是相对较少的人将从中受益的一步(只有一点点)。


1
任何关心空格的语言都不是“精心设计的”,但我同意普及是关键。
Nagora 2015年

1
@Nagora:意见不一。FWIW,您总是可以用大括号和分号而不是空格来编写Haskell,我想Python也有类似的后备。只是,没有人这样做,因为基于缩进的分组对于可读性而言非常出色。
大约

1
  1. 在需要的时候在那里
  2. 它具有足够的视觉效果,初学者可以花一周时间自定义提示。
  3. 普通用例就足够了(最常见的是启动一个命令)
  4. 在不够好的perl的地方,python和lua可以解决问题。
  5. perl制作了一个糟糕的交互式外壳
  6. 尽管从理论上说,鱼,ksh或zsh可能是更好的外壳,但是当perl运作得很好或可移植性成为问题时,我仍然没有足够的改进来打扰我,所以无论如何我都以破折号为目标。

0

IMO是“临界质量”的主要答案。Bash不仅用于命令行工作,还用于脚本编写,并且那里有大量的Bash脚本。不管现在交互的替代方法有多么好,能够“即插即用”这些脚本的需求都比这些优势更为重要。因此,现在唯一可以实际取代Bash的外壳是完全向后兼容的外壳,而最有可能的候选对象是Bash的下一个版本。


1
您可以使用任何bash脚本,无论您的默认shell是什么。这就是she-bang(#!/ bin / bash)在脚本顶部的含义。
Panther

1
@ bodhi.zazen只要系统中存在bash shell。我至少知道一个不包含bash的Solaris版本。
TulainsCórdova'15

@ bodhi.zazen必须在两个shell之间进行切换会带来精神上的损失-一个用于交互,另一个用于脚本。通常不值得打扰。
Nagora 2015年

1
@Nagora 运行脚本的精神成本是多少?
kos 2015年

@kos,如果您只是运行脚本,则没有。如果必须维护和修改脚本,则需要牢记不同底层shell之间的细微差别,在这种情况下,当您必须在其中做一些工作时,会产生持续的金属成本和上下文切换成本。 “其他”语法。
纳戈拉2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.