主流 *NIX shell 之间的根本区别是什么?

主流 *NIX shell 之间的根本区别是什么?

主流 *NIX shell 之间的根本区别是什么?什么情况可能会促使您使用其中一种而不是另一种?我知道其中一些可能取决于用户偏好,但我只使用过 Bash,并且我有兴趣了解另一个 shell 可能在哪里有用。

另外,在一个 shell 或另一个 shell 下运行时,是否会对用户编写的 shell 脚本产生影响,或者只是更改文件顶部的 shell ?我的直觉告诉我这并不容易。

答案1

对于交互式使用,有两个主要竞争者,重击桀骜,加上掉队者tcsh和新人

  • Bash 是 GNU 项目的官方 shell,也是大多数 Linux 发行版上的默认 shell。在其他没有附带像样的交互式 shell 作为基本安装一部分的 unice 上,我认为人们倾向于选择 Bash,处于自我强化的“Bash 无处不在,所以我也会使用它”循环中。也可以看看为什么 Bash 无处不在?(有很多历史信息)。

  • Zsh 几乎拥有 Bash 的所有功能以及更多(有用!)的功能。它的主要缺点是不太出名,这实际上意味着您不太可能发现它已经安装在其他人设置的系统上,并且有关它的第三方文档也较少。也可以看看您使用 zsh 的哪些功能?,zsh 中有哪些功能是 Bash 中缺少的,反之亦然?,Bash 和 Zsh 之间的实际区别是什么?

  • Tcsh 曾经(直到 20 世纪 90 年代初)是具有最佳交互功能的 shell,就像它的前身 csh 一样。这使得它在交互式使用中很受欢迎(但是不用于编写脚本)。 Zsh 赶上了 tcsh 并很快进一步改进,Bash 在 2000 年代初期赶上了(通过可编程完成),而 tcsh 在过去 15 年里几乎没有取得任何进展。因此现在没有什么理由去学习 tcsh。

  • Fish 试图比它的前辈更干净。它有一些简洁的功能(更简单的语法、命令行上的语法着色),但缺乏其他功能(无论作者不喜欢什么)。鱼类群落甚至比 zsh 的群落还要小,这使得影响更加严重。


对于脚本编写,您可能希望以多种语言为目标,具体取决于您希望脚本的可移植性。

  • 任何假装类似于 Unix 的东西都有一个伯恩派生的 shell 作为/bin/sh.周围还有一些商业单位,/bin/sh没有的地方POSIX符合。

  • 几乎每个现在运行的 UNIX 都有一个sh至少符合 POSIX.2-1992 并且通常至少符合的可执行文件POSIX:2001 又名 Single Unix v3。该 shell 可能位于不同的目录中,例如/usr/bin/posix/usr/xpg6/bin。几乎每个强大到足以支持它的系统都存在 POSIX 模拟层,这使其成为一个有吸引力的目标。

  • 许多 UNIX 系统都有克什93,它带来了 POSIX sh 缺乏的一些非常有用的功能(数组、关联数组、扩展 globs ( *(foo), @(foo|bar), …)、 null globs ( ~(N)foo*), …)。 Ksh 最初是商业软件(在一些习惯养成后,它于 2000 年免费),许多免费的 unice(Linux、*BSD)养成了只提供更旧的免费克隆的习惯(PDKSH) 缺乏许多这些有用的功能。Pdksh 现在正被姆克什在 OpenBSD 之外,但即使是 mksh 也无法实现所有 ksh93 功能。如今,您不能指望 ksh93 随处可用,尤其是在以 Bash 为标准的 Linux 上。

  • 重击在 Linux 上始终可用(某些嵌入式变体除外),并且通常在其他 unice 上可用。它具有 ksh93 的大部分有用功能,尽管有时具有不同的语法。

  • 兹什具有 ksh93 和 Bash 的大部分有用功能。它的核心语法更清晰,但与 Bourne 不兼容。除 macOS 之外,不要指望 zsh 在您未安装的系统上可用。

  • 对于更高级的脚本编写,您可以转向珀尔或者Python。这些语言具有适当的数据结构、良好的文本操作功能、良好的流程组合和通信机制以及大量可用的库。大多数 UNIX 系统都具有它们,要么与操作系统捆绑在一起,要么由管理员安装(因为 Perl 和 Python 脚本如此之多,以至于很少有系统至少拥有其中之一)。

答案2

shell 有两种基本类型:sh(例如 bash)和 csh(例如 tcsh)。对于交互式使用,这主要取决于您的习惯。我多年来一直使用 csh,然后使用 tcsh,切换起来会很痛苦,因为我已经习惯了。我也使用过 bash,而且我不认为有任何令人信服的理由要切换。除非其中之一在您经常使用的机器上不可用。

对于编程来说,语法是不同的。您不能只更改 shell,还需要更改脚本的语法。对于脚本编写,您需要使用 sh 或 bash。正如所解释的,语法更适合脚本编写这里(谢谢里卡多·穆里对于链接。这是一个很好的指导关于 bash 脚本。

如果您还没有决定使用 shell,并且希望编写一些脚本,我会使用 bash 只是为了减少您需要学习的东西。

答案3

回到过去,当 AT&T 发明 UNIX 时,就有由 Steve Bourne 编写的 Bourne Shell。它非常基础,缺乏许多我们现在认为理所当然的工具。

AT&T 当时并没有真正涉足 UNIX 业务,因此伯克利当时采用了非常基本的操作系统,并对 BSD UNIX 进行了一些更改。在众多更改中,有一种名为 csh 的新 shell,它比 sh 有很多改进,包括作业控制、更好的交互使用等等。不幸的是,他们认为 sh 编程语法很糟糕,于是创建了自己的语法,(有些糟糕)抄袭了 C 编码风格。(经典的抱怨是http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/) 所以现在有两种语法。

后来,他们对 CSH 进行了改进,添加了制表符补全和其他一些功能。这变成了 tcsh,如果您使用 CSH,这可能就是您使用的。

AT&T 认为它并未完全退出 UNIX 业务,并且他们也对其进行了完善。 David Korn(好人)创建了 Korn shell。基于扩展 Bourne shell 语法的思想,它为程序员和交互使用添加了很多东西。实际上有几个版本,你可能很少看到像 ksh88 和 ksh93 这样的东西,表示变体。

然后出现了 FSF 和 GNU 操作系统。他们想要制作自己的 UNIX 兼容操作系统,名为 Hurd,并希望为其提供更好的 shell。他们将 bash 称为 Bourne Again SHell。 POSIX 规则正好在这个时候出现,他们想要制定POSIX 外壳。他们环顾四周,采用了 Bourne shell 的语法和 Korn shell 的改进,再加上窃取和扩展了 tcsh 的交互功能。它成为 Linux 上事实上的 shell,因此非常常见。

还有 zsh,被称为“终极”shell。这在 Linux 世界中也很常见。它扩展了 bash(并且进行了一些异花授粉,一些新东西又回到了 bash)。

如果我要选择 shell,我会选择 bash 或 zsh。 bash 可能比 zsh 存在更多的地方。 zsh 更强大,但 bash 对我来说还不错。真正的 /bin/sh Bourne shell 的存在只是出于历史原因。 bash 几乎拥有 ksh 所提供的所有功能,甚至更多。其语法比 csh 或 tcsh 更清晰,并且比其中任何一种具有更好的功能。

转换脚本取决于从什么到什么。 Bourne shell 风格(sh、ksh、bash、zsh)与 csh 风格(csh、tcsh)之间的转换会很困难。从旧的到新的(/bin/sh => bash,/bin/ksh => zsh)会比其他方式更容易。

答案4

随着时间的推移,我使用了很多 shell。不是任何超级先进的东西,而是许多实用的系统管理和编程内容,需要足够的定制。

我认为 zsh 有更多的自定义选项,至少过去是这样,但在使用它很多年之后,我已经受够了它的稳定性和字符编码问题。 Bash 坚如磐石,从来没有遇到过类似的问题,而且它安装在任何地方。

相关内容