主流 *NIX shell 之间的根本区别是什么,哪些场景可能会促使您使用一种而不是另一种?我知道其中一些可能归结为用户偏好,但我只使用过 Bash,我很想知道另一个 shell 可能有用的地方。
此外,在一个或另一个 shell 下运行时是否对用户编写的 shell 脚本有影响,或者仅仅是更改文件顶部的 shell 的问题?我的直觉说这并不容易。
Gil*_*il' 56
对于交互式使用,有两个主要的竞争者,Bash和zsh,加上落后的tcsh和新人fish。
Bash 是 GNU 项目的官方 shell,也是大多数 Linux 发行版上的默认 shell。在其他没有将像样的交互式 shell 作为基本安装的一部分附带的 unice 上,我认为 Bash 是人们倾向于选择的,在自我强化中“Bash 无处不在,所以我也会使用它”循环。另请参阅为什么 Bash 无处不在?(有很多历史信息)。
Zsh 几乎拥有 Bash 的所有功能以及更多(有用的!)功能。它的主要缺点是鲜为人知,这实际上意味着您不太可能发现它已经安装在其他人设置的系统上,并且关于它的第三方文档较少。另请参阅您使用哪些 zsh 功能?, zsh 中有哪些功能在 Bash 中没有,反之亦然?, Bash 和 Zsh 的实际区别是什么?.
Tcsh 曾经(直到 1990 年代初期)是具有最佳交互功能的 shell,就像它的前身 csh。这使它在交互式使用中很受欢迎(但不适用于脚本)。Zsh 赶上了 tcsh 并且相当迅速地进一步改进,Bash 在 2000 年代初赶上了(可编程完成),而 tcsh 在过去 15 年里几乎没有取得任何进展。因此,现在几乎没有理由学习 tcsh。
Fish 试图比它的前辈更干净。它有一些简洁的功能(更简单的语法,命令行上的语法着色)但缺少其他功能(无论作者不喜欢什么)。鱼群甚至比 zsh 小得多,这使得影响更加严重。
对于脚本,您可能希望针对多种语言,具体取决于您希望脚本的可移植性。
任何伪装成类 Unix 的东西都有一个Bourne派生的 shell 作为/bin/sh. 仍然有一些商业 unices/bin/sh不兼容POSIX。
几乎每个现在运行的 unix 都有一个sh至少符合 POSIX.2-1992 并且通常至少符合POSIX:2001 aka Single Unix v3的可执行文件。此 shell 可能位于不同的目录中,例如/usr/bin/posix或/usr/xpg6/bin。POSIX 仿真层也适用于几乎所有强大到足以支持它的系统,使其成为一个有吸引力的目标。
许多 unix 系统都有ksh93,它带来了 POSIX sh 缺乏的一些非常有用的功能(数组、关联数组、扩展的 globs ( *(foo), @(foo|bar), …), null globs ( ~(N)foo*), …)。Ksh 最初是商业软件(它在 2000 年成为免费的,在一些习惯养成后),许多免费的 unices(Linux,*BSD)习惯于只提供一个更旧的免费克隆(pdksh),缺乏许多这些有用的功能. Pdksh现在在OpenBSD 之外被mksh取代,但即使是 mksh 也无法实现所有 ksh93 功能。今天,您不能指望 ksh93 随处可用,尤其是在 Bash 是常态的 Linux 上。
Bash在 Linux 上始终可用(除了一些嵌入式变体),并且通常在其他 unice 上可用。它具有 ksh93 的大部分有用功能,但有时使用不同的语法。
Zsh具有 ksh93 和 Bash 的大部分有用功能。它的核心语法更简洁,但与 Bourne 不兼容。除了 macOS,不要指望 zsh 在您没有安装的系统上可用。
对于更高级的脚本,您可以使用Perl或Python。这些语言具有适当的数据结构、良好的文本操作功能、良好的进程组合和通信机制以及大量可用的库。大多数 unix 系统都有它们,要么与操作系统捆绑在一起,要么由管理员安装(因为那里有太多的 Perl 和 Python 脚本,以至于它是一种罕见的系统,其中至少有一个)。
Kei*_*thB 27
shell 有两种基本风格,sh(例如 bash)和 csh(例如 tcsh)。对于交互式使用,主要取决于您的习惯。我已经使用 csh,然后使用 tcsh,很多年了,切换会很痛苦,因为我太习惯了。我也使用过 bash,我认为没有任何令人信服的理由要切换。除非您经常使用的机器上没有一个或另一个。
对于编程,语法是不同的。您不能只更改外壳,还需要更改脚本的语法。对于脚本,您想使用 sh 或 bash。语法是更适合于脚本,如解释在这里(感谢里卡多·穆里的链接。该是一个很好的指南上的bash脚本。
如果您还没有决定使用 shell,并且您希望编写一些脚本,那么我会使用 bash 来减少您需要学习的东西的数量。
Ric*_*lka 12
回到过去,当 AT&T 发明 UNIX 时,还有由史蒂夫·伯恩 (Steve Bourne) 编写的 Bourne Shell。这是非常基本的,并且缺少很多我们现在认为理所当然的工具。
AT&T 并不真正从事 UNIX 业务,因此此时 Berkelely 稍微采用了非常基本的操作系统,并且他们对 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 操作系统。他们想要制作自己的名为 Hurd 的兼容 UNIX 的操作系统,并且想要一个更好的外壳。他们称 bash 为 Bourne Again SHell。POSIX规则进来就在这个时候,他们想使该POSIX外壳。他们环顾四周,采用 Bourne shell 的语法和 Korn shell 的改进,并从 tcsh 窃取和扩展交互功能。它成为了 Linux 上事实上的 shell,所以它很常见。
还有 zsh,被写成“终极”外壳。这在 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)比其他方式更容易。
小智 8
shell 的两个主要分支是 Bourne shell 衍生物(sh、bash、ksh、ash、yash 和 zsh)和 csh 衍生物(tcsh 和...uhm...tcsh)。
我怀疑(尽管我没有实际数字)bash 是使用最广泛的,它似乎是大多数 linux 中的默认 shell。
大多数用一种 bourne shell 衍生物编写的东西可能适用于其他的。大多数用 Bourne shell 编写的东西可能需要修改才能在 csh 或 tcsh 下运行。
我个人在开始时使用 ksh,因为那是我使用的系统上的内容。我现在主要使用bash。