我很好奇为什么要运行bash而不是zsh。 我的意思是zsh完全向后兼容bash。 不要误解我的意思:我不喜欢bash或任何东西。 我只是真的想知道是否有任何优势,通过zsh使用它。
那么有什么理由在bsh上使用bash?
想到两个原因:
首先 – 几乎到处都有。 我有几个Linux系统(在这种情况下,CentOS 4.x)没有安装zsh。 同样,我必须触及像Solaris 2.6或更高版本的旧系统,HP-UX 10及更高版本,以及类似AIX的蹩脚版本。 因此,我几乎不得不在这些计算机上使用bash,这是因为在一个月的时间内,我触摸了几十台甚至几百台个人计算机,为了保持界面的一致性,最终被卡住了默认值。
其次 – 几乎可以在任何地方使用。 这意味着我可以编写一个bash shell脚本,并确保在其他地方传输时能够正常工作。
是的,这些原因在表面上是相同的,但背后的理由是不同的。
Bash通常会随每个系统一起提供,zsh不会。 我喜欢zsh,但正因为如此,我使用zsh进行交互式使用,而Bash则用于我所有的脚本 。
我发现这使得一切都变得简单了,因为即使当我购买任何兼容的bash(setopt SH_WORD_SPLIT?)时,我仍然遇到细微的差别。
zsh不完全兼容bash。 有各种各样的差异。 较新的zsh与bash(=〜支持,exec现在有额外的标志选项等)更兼容,但完全兼容性不是一个目标,即使在“模拟”下也是如此。
例如,bash substring是$ {foo:offset:len},但在zsh中是$ foo [start,end],这只是一个简单的例子。
zsh是受tcsh和ksh影响的shell,它以自己的方式完成许多事情; POSIX兼容性显然不是一个目标,但是开发人员可以响应那些添加选项/模拟行为的修补程序,使其更接近POSIX。 但是当你真正开始使用shell的力量的时候,你开始创build只写脚本,甚至比bash还要多。
bash是POSIX sh + ksh +迂回主义,现在从zsh复制了一些function。 它也有只写脚本,但是因为它没有强大的操作符,所以最终不会使用zsh的简洁性,而且事情可能更具可读性(除了所有的引用以避免空白分割之外, 愚蠢的 ksh-style $数组意味着首先数组元素,而不是所有元素的数组等等)。
编写充分利用任何一个shell的能力的脚本是不明智的,除非你处于受限的环境中(例如,编写系统rc脚本,某些FS可能不会被挂载等)。 理想的情况下,如果你希望别人能够维护它,那么使用Perl / Python / Ruby /任何足够大的expression式,而不是在Bourne sh中。 保持与shell相关的东西(标签完成编程等)的东西。
我不会在zsh中使用bash。 我会用简单的脚本来使用shsh,或者转换成一种语言,在这种语言中,关联数组有一些体面的操作符(不像在zsh中,它们又是'简洁的')。 如果我需要一个小function来扩展现有的经过validation的工作脚本,并且没有时间重写它,我可能会将 sh脚本切换到bash。
我的build议是:如果你打算使用绝对的可移植性,那么使用Bourne shell规则编写,甚至不要打扰Korn shell扩展。 如前所述,那些周围没有GNU shell的老式“大箱子”
Bash已经“太多”了。 我有一个喜欢zsh的工作的朋友,但我不知道它到底是什么。
无论如何,要么为Bourne(或“Bourne again”)shell编写代码,或者,如果您正在为less量特定的框做一个自定义脚本,请完全跳过“shell hell”,然后使用perl或python编写你最喜欢的本地安装的翻译是)。
顺便说一下,这里已经有很多人告诉你几乎每个地方都有bash,所以用它来编写可移植的脚本,这是错误的。
废话。 如果你知道你关心的每个系统都有BASH,那么这是一个完全合理的陈述。 BASH有很多有用的特性,在POSIX sh中是不能合理模拟的。 轻浮地使用非POSIXfunction并不是一个好主意,但是当你真正需要它们的时候使用它们并不错。
可移植性不是绝对的。 这是有争议的,你需要采取多远,就像其他任何东西。 例如,Fedora使用shell命令来构buildRPM软件包,Fedora打包指南指出,由于所有软件包都必须在Fedora上本地构build,因此使用BASH的所有function都可以。 尽pipe理论上没有BASH的其他发行版可能需要重复使用它们的源代码RPM,但他们根据实用性做出了关于可移植性的决定,而不是“总是使用POSIX !! 1”的口头禅。
ZSH并没有被当成默认shell,只是因为它是一堆乱七八糟的想法。
除了上面给出的可移植性原因之外,另一个可能是bash还在增加function。
例如bash v4.x +介绍:
recursion通配:
rm -f ** / * .log
autocd:
键入“/ tmp”而不是“cd / tmp”
顺便说一下,你已经多次被告知,实际上到处都是bash
,所以用它来编写可移植的脚本, 这是错误的 。
编写可移植的unix脚本的正确方法是使用sh
,它在每个* nix系统中都可以find 。
除sh
之外的其他所有shell只是您的一个日常交互工具。
当来到bash
vs zsh
– bash
捆绑在更多*nixes
比zsh
,所以这里有安装额外的软件到系统的缺点 – 你必须维护它。 有些人喜欢zsh“酷炫的function”,所以他们喜欢支付这个价格,有些不是。
还有一点:
许多程序默认提供酷bash完成。 对我来说,这是不能切换的原因。
[2013年7月join]自从上面的评论使用zsh几年后,我不得不说,选项卡完成(即使内置一个,没有第三方面的修改)是辉煌的,看起来像它是远远超出了由bash 。 :)。