有什么理由在zsh上使用bash吗?[关闭]


33

我很好奇为什么有人要运行bash而不是zsh。我的意思是zsh与bash完全向后兼容。不要误会我的意思:我不喜欢bash或其他任何东西。我只是真的想知道使用它比zsh有什么好处。

那么在zsh上使用bash有什么原因呢?


2
只是想指出ZSH与BASH并不完全向后兼容。在ZSH中,数组索引从1开始-在BASH中,数组索引从0开始。还有其他区别,但是我想指出这一点。
Charles Addis

Answers:


29

我想到两个原因:

首先-它几乎可以在任何地方使用。我有几个没有安装zsh的Linux系统(在这种情况下为CentOS 4.x)。同样,我必须接触古老的系统,例如Solaris 2.6和更高版本,HP-UX 10和更高版本,以及同样令人毛骨悚然的AIX版本。因此,我几乎必须在这些计算机上使用bash,因为我在一个月的时间内接触了数十台(如果不是几百台)单台计算机,并且为了获得界面的一致性,您最终会被困在默认值。

其次-它几乎可以在任何地方使用。这意味着我可以编写一个bash shell脚本,并有99%的把握确保将其转移到其他地方后也可以使用。

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


2
我记得在HPUX上有ksh88 / ksh93,我们再也没有安装bash的权限。
Zlemini

24

Bash通常随每个系统一起提供,而zsh没有。我喜欢zsh,但是正因为如此,我将zsh用于交互使用,但将Bash用于所有脚本编写

我发现这使一切变得更简单,因为即使我购物兼容的bash(setopt SH_WORD_SPLIT吗?),我仍然会遇到细微的差异。


3
那就是您所说的每个GNU / Linux系统吗?
andol

2
好吧,我发现它与OS / X和bsd一起提供,我对其他* nix的经验不多,它们(最新版本)通常不具备bash吗?
凯尔·布​​兰特

1
Solaris的较早版本不包含bash。我通常必须依靠Bourne作为脚本编写的外壳。这种情况已经有一段时间了,但是您可能仍会在某些大型企业中遇到它。
user5336

3
那时必须是不同的BSD:s。至少在OpenBSD和FreeBSD中,您必须将bash与端口/软件包分开安装。
andol

andol:那些是我曾经使用过的。
凯尔·布​​兰特

13

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 + pedanticism,现在从zsh复制了一些功能。它也具有只写脚本,但由于它的运算符功能较弱,您最终没有使用zsh的简洁性,而且内容可能更具可读性(除了所有引用,以避免空格分隔,愚蠢的 ksh风格$ array表示首先-数组元素,而不是数组所有元素等)。

除非您在受限的环境中(例如,编写系统rc脚本,可能无法挂载某些FS的脚本),否则要充分利用任一shell的功能编写脚本都是不明智的。理想情况下,如果希望其他人能够维护Perl / Python / Ruby / Bourne sh中不需要的表现力,则可以使用Perl / Python / Ruby /任何东西。保留外壳内容以用于与交互式外壳相关的事情(制表符完成编程等)。

我不会在zsh上使用bash。对于简单的脚本,我会在zsh上使用裸露的sh,或者切换到关联数组具有不错的运算符的语言(与zsh不同,它们又是“简洁的”)。我可能会,如果我需要一个小功能扩展现有的成熟工作的脚本,没有时间,现在重写它切换sh脚本来砸。


6
注意:$ {foo的:偏移:len个} 现在支持的zsh,兼容性。
Phil P

6

我的建议:如果您要获得绝对的可移植性,请使用Bourne shell规则编写,甚至不用担心Korn shell扩展。如上所述,这是一些较旧的“大盒子”,上面根本没有GNU外壳。

Bash已经“做太多了”。我有一个喜欢zsh的工作朋友,但我不知道它到底能做什么。

无论如何,要么为Bourne(或“再次bourne”)shell编写代码,要么,如果您正在为少量特定框执行自定义脚本,则完全跳过“ shell hell”,而仅使用perl或python(或其他方法)进行编写您最喜欢的本地安装的解释器是)。


5

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

例如,引入了bash v4.x +

  • 递归遍历:

    rm -f ** / *。log

  • autocd:

    键入“ / tmp”,而不是“ cd / tmp”


2
来自zsh的bash复制功能如何成为使用bash的理由?
qqx 2012年

5

顺便说一句,您在这里多次被告知,bash实际上到处都是,所以用它来编写可移植脚本,这是错误的。

废话。如果您知道您关心的每个系统都有BASH,那么这是一个非常合理的声明。BASH具有许多有用的功能,这些功能无法在POSIX sh中合理地模拟。轻描淡写地使用非POSIX功能不是一个好主意,但是在真正需要它们时使用它们就可以了。

可移植性不是绝对的。就像其他任何东西一样,这是有争议的。例如,Fedora使用shell命令来构建RPM软件包,而Fedora打包准则指出,由于所有软件包都必须在Fedora上本地构建,因此可以使用BASH的所有功能。即使从理论上讲,没有BASH的其他发行版可能想重用其源RPM,但他们还是基于实用性而不是您的“ ALWAYS UZE POSIX !! 1”口头禅决定了可移植性。

ZSH尚未成为默认外壳,仅仅是因为它是一堆杂乱无章的想法。


2
您能否解释一下zsh中哪些功能或想法有些不成熟,为什么?
funroll 2015年

2

顺便说一句,您已经在这里被告知很多次,bash几乎可以在任何地方找到它,因此请使用它来编写可移植脚本,这是错误的

编写可移植的unix脚本的正确方法是使用sh,这在每个* nix系统中都可以找到

除此以外的所有其他Shell sh仅仅是您的日常交互工具。

当来到bashVS zsh- bash更多的是捆绑*nixeszsh,所以这里来安装额外的软件系统的缺点-你必须去维护它。有些人喜欢zsh的“酷功能”,所以他们喜欢付这个价钱,有些则不然。


2
sh的许多现代实现只是bash的链接。
user9517支持GoFundMonica 2012年

2
@Iain Ubuntu 默认情况下使用破折号,即使sh是bash,当以方式运行时,也会启用兼容模式sh
mgorven

2

还有一点:

默认情况下,许多程序提供了出色的bash补全功能。对我来说,这是不切换的原因。

[2013年7月添加]自从以上评论以来,在使用zsh数年之后,我不得不说制表符补全(即使是内置的,没有第三次修改)也很出色,而且看起来远远超出了bash提供的那种。 。:)。


3
我认为这也适用于ZSH,在ZSH中完成制表符后,我会收到许多程序特定的参数……
Kyle Brandt

有趣。您是说bash完成文件可与zsh一起使用,还是仅某些程序具有其特定于zsh的完成内容?仍然有一些bash完成文件的std布局,zsh可能会自动考虑,也可能不会自动考虑。您是否已调整zsh配置使其正常工作?
Wojciech Kaczmarek,2009年

@Wojciech Kaczmarek:我认为您需要以下版本的19.3:zsh.sourceforge.net/Doc/Release/zsh_19.html。老实说,我从来没有花时间去真正了解它,就扯下.zshrc我在网上找到:-)但它会从像易方案,grep的,等完成的命令行参数....
凯尔·勃兰特

5
bash的制表符完成与zsh的旧制表符完成系统非常相似。这是从zsh复制到bash的想法之一(还有其他将bash复制到zsh的想法)。您可以使用zsh中为bash编写的完成脚本,方法是运行“ bashcompinit”,然后在zsh中使用“ complete”和/或“ compgen”命令-这是可能的,因为bash功能是zsh和bsh中功能的一部分。因此可以被模仿。因此,没有必要切换到bash,因为命令附带了bash补全功能。
Phil P 2010年
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.