有什么理由使用 bash 而不是 zsh 吗?

有什么理由使用 bash 而不是 zsh 吗?

我很好奇为什么有人会选择运行 bash 而不是 zsh。我的意思是 zsh 完全向后兼容 bash。别误会我的意思:我并不是不喜欢 bash 之类的。我只是真心想知道使用它比使用 zsh 有什么优势。

那么,为什么要使用 bash 而不是 zsh 呢?

答案1

我想到两个原因:

首先 —— 它几乎随处可用。我有几个 Linux 系统(本例中为 CentOS 4.x),它们没有安装 zsh。同样,我必须接触 Solaris 2.6 及更高版本、HP-UX 10 及更高版本等老旧系统,以及同样老旧的 AIX 版本。因此,我几乎必须在这些计算机上使用 bash,我之所以这样做,是因为我在一个月内接触了数十台甚至数百台个人计算机,为了使界面保持一致,您最终只能使用默认设置。

第二 —— 它几乎随处可用。这意味着我可以编写一个 bash shell 脚本,并且 99% 确信它在转移到其他地方时可以正常工作。

是的,这些原因表面上相同,但背后的原因却不同。

答案2

Bash 通常随每个系统一起提供,而 zsh 则不随系统提供。我喜欢 zsh,但正因为如此,我使用zsh 用于交互式使用,但 Bash 用于我所有的脚本

我发现这使得一切变得更简单,因为即使我购买与 bash 兼容的任何产品(setopt SH_WORD_SPLIT?),我仍然会遇到细微的差别。

答案3

zsh 并不完全兼容 bash。两者之间存在各种差异。较新的 zsh 与 bash 更兼容(支持 =~,exec 现在具有额外的标志选项等),但完全兼容并不是目标,即使在“模拟”下也是如此。

例如,bash 子字符串是 ${foo:offset:len} 但在 zsh 中它是 $foo[start,end],这只是一个简单的例子。

zsh 是一个受 tcsh 和 ksh 影响的 shell,它以自己的方式执行许多操作;POSIX 兼容性显然不是目标,但开发人员对添加选项/模拟行为的补丁很敏感,这些补丁使它更接近 POSIX。但当你真正开始了解 shell 的强大功能时,你就会开始创建只写脚本,甚至比 bash 还要多。

bash 是 POSIX sh + ksh + 繁琐,现在从 zsh 复制了一些功能。它也有只写脚本,但由于它的运算符功能较弱,因此你最终无法使用 zsh 的简洁性。可能更具可读性(除了所有避免空格分割的引用,愚蠢的ksh-style $array 表示数组的第一个元素,而不是数组的所有元素,等等)。

编写充分利用任一 shell 功能的脚本是不明智的,除非您处于受限环境中(例如,编写系统 rc 脚本,某些 FS 可能无法安装等)。理想情况下,如果您希望其他人能够维护它,则对于任何足够大而需要 Bourne sh 中没有的表达能力的东西,请使用 Perl/Python/Ruby/whatever。将 shell 内容保留用于与交互式 shell 相关的事情(制表符完成编程等)。

我不会使用 bash 而不是 zsh。对于简单的脚本,我会使用裸 sh 而不是 zsh,或者切换到一种关联数组具有适当运算符的语言(与 zsh 不同,在 zsh 中,它们再次“简洁”)。我可能如果我需要一个小功能来扩展现有的已证明有效的脚本而又没有时间重写它,那么就将 sh 脚本切换为 bash。

答案4

除了上面给出的可移植性原因之外,另一个原因可能是 bash 仍在添加功能。

例如bash v4.x+介绍:

  • 递归遍历:

    rm -f **/*.log

  • autocd:

    输入“/tmp”而不是“cd /tmp”

相关内容