fbpx
Bash 与 Zsh

Bash vs Zsh:两个命令行 shell 的比较

如果您曾经在 *nix 系统(基于 Unix 或类 Unix)上使用过命令行,那么您可能已经使用过 bash shell。 Bash(“Bourne-again shell”的缩写)是许多类 Unix 操作系统的默认 shell。 

类 Unix 操作系统的常见示例包括 GNU/Linux 和 macOS。 尽管终端存在许多其他 shell,但最流行的 shell 之一是 zsh 或“Z shell”。

虽然 bash 和 zsh 是功能强大的 shell 并且具有许多突出的特性,但它们也具有用户可能有不同偏好的区别。 这篇文章将概述 bash 与 zsh 的特性和比较,如何将两者设置为默认 shell,以及一些配置建议。

bash和zsh的简短历史

1971 年,第一个版本的 Unix 操作系统将 Thompson shell 作为其默认 shell。 虽然缺乏脚本功能,但第一个 shell 建立了许多输入/输出重定向标准。 随着 7 年版本 1979 Unix 的发布,新操作系统以 Bourne shell 作为其默认 shell 进行分发。

制作重击

1989年下半年,Brian Fox为GNU项目创建了Bash shell, 可行的软件替代品 对于 Bourne shell。 Bash 对其前身进行了重大改进。 这些改进中最突出的是它作为脚本语言的能力,bash 用户可以编写他们的程序来自动执行任务。

这些“shell”脚本可以通过键入文件名(通常带有 .sh 扩展名)来执行。 在大多数情况下,bash 可以支持 Bourne 和 C shell 的大部分功能和独特的分支,包括命令行编辑和整数计算。

创建zsh

Bash 出现后不久,普林斯顿大学的一名学生创建了 Z shell 或“zsh”。 与此操作外壳一起使用的是一个名为 Oh My Zsh 的基于社区的在线平台,它具有重要的扩展功能,例如 zsh 的插件和主题。 截至 2019 年 XNUMX 月,macOS Catalina 宣布他们将采用 zsh 作为默认 shell 以取代 bash——这对 zsh 爱好者来说是一个重大的“胜利”。

wp引擎托管

Bash 与 zsh:bash 和 zsh 之间的共同特征

在大多数情况下,bash 与 zsh 共享许多方便的特性,这些特性使它们都成为高效的 shell。

z命令

两者共享的一个方便功能是 z 命令,它允许开发人员跟踪他们的目录。 使用 z 命令,您可以通过键入 z 后跟目录名称来导航到经常/最近访问的目录。 例如,假设您有一个位于 ~/src/2018/projects/newProject 的目录 newProject。 使用此工具,您可以键入 z newProject。

自动完成

这两个 shell 的另一个实用方面是它们的选项卡自动完成功能。 您可以在每个 shell 中键入命令,后跟 -,然后点击选项卡。 此操作将立即显示该命令的所有可用选项。 然后您可以通过选项卡浏览选项,直到找到您想要的选项。 这两个 shell 都为其命令行自动完成提供了灵活性和自定义。

自动改正

此外,还有一个有用的实用程序 网页设计公司 在这两个 shell 中,大部分都是自动更正。 在 Z shell 中,如果您在写入文件位置时犯了一个无意的拼写错误,拼写校正是内置的并且会自动检测拼写错误。 虽然这不是 bash 的习惯,但您可以使用 shopt 命令 cdspell 和 dirspell 轻松地进行必要的调整以允许自动更正。

颜色定制

即使在视觉吸引力和组织方面,两种 shell 都相当不错地完成了任务。 zsh 将通过向目录添加颜色突出显示来区分两者。 此外,字体粗细会稍微粗一些。 这对于查看什么是文件和目录非常有帮助。 使用的确切颜色取决于您的终端颜色设置。 另一方面,bash 用户还可以调整他们的界面 反映他们的视觉需求 使用 LS_colors 变量。

虽然这些只是两个 shell 提供的各种工具中的一部分,但它们提供了 bash 和 zsh 公认的相似之处的一瞥。 但是,它们都具有一些区别,可以在开发人员中产生对其中一个的偏好。

bash 与 zsh

Bash 与 zsh:考虑在 shell 之间切换的原因

bash 与 zsh 的命令和整体交互在本质上是相同的。 对一种 shell 的知识和熟悉可以很容易地转化为另一种 shell,而无需解决陡峭的学习曲线。 但是,这两个 shell 都有独特的功能,可能会促使开发人员声明明确的偏好。

其一,zsh 拥有强大的在线社区,称为 哦,我的Zsh. 哦,My ZSH 是管理 zsh 配置的最古老和最受欢迎的选项之一。 Oh My ZSH 提供社区提供的 250 多个插件和 140 个不同的主题,是开始自定义 z shell 的好地方; 它甚至带有一个自动更新功能,可以让你的 shell 保持更新。 这允许用户在具有更个性化界面的 shell 中工作,通过各种 工具,并访问方便的开箱即用支持系统。 例如,界面的一个非常受欢迎的选项是右手侧提示或在输入长文件路径或命令时自动隐藏的侧提示。 即使是这种微小的灵活性也会让开发人员转向 zsh。

另一方面,Bash 有一组令人印象深刻的编程功能,例如循环和条件构造、波浪号和大括号扩展以及别名的使用。 它也有一些怪癖,比如强大的调用工具、被设置为受限的 shell 模式、具有特定的 POSIX 模式等等。 因为 Bash 也是一个较老的 shell,所以这个软件有无限的在线资源。

bash 与 zsh

安装zsh

如果您使用的是 OS X,那么您的系统上已经安装了 zsh。 要检查,请运行以下命令:

哪个zsh

如果它已经安装,您应该会收到一条输出消息,指出 /bin/zsh 是 shell 的文件路径。 如果由于某种原因您移动了默认安装目录,它可能会显示另一个文件路径。 如果您收到表明未找到 zsh 的输出,则必须通过以下方式安装它 家酿。 您可以通过运行以下命令来这样做:

brew安装zsh

对于 CentOS、Redhat 和 Fedora Linux 发行版,您可以通过运行 yum install zsh 来安装 zsh。

同样,sudo apt-get install zsh 将在 Debian 和 Ubuntu 发行版上安装 shell。 即使 bash 是您的默认 shell,您也可以开始使用 zsh。 要临时试用,请在命令行上运行 zsh。 这将临时切换当前会话的 shell。 为了充分利用 zsh,强烈建议升级您的终端而不是使用默认终端。

终端是 Mac OS X 上的默认终端。虽然它工作得很好,但选项如 iTerm 2> or  提供巨大的定制。 我使用 iTerm 2,尽管 Hyper 是跨平台的绝佳选择。

将zsh设置为默认外壳

现在您已经安装了 zsh,将其设置为默认 shell 所需要做的就是运行以下命令:

chsh -s / bin / zsh

要开始使用 zsh,请关闭您的终端窗口并打开一个新窗口——您现在将运行 zsh 而不是 bash。

重返bash

如果出于某种原因,您想返回 bash 作为您的默认 shell,请首先找出 bash 与哪个 bash 一起安装的位置。

默认路径输出应该是/bin/bash。

要改回来,请使用 chsh -s /bin/bash。

运行 bash 还会临时切换该会话的 shell。

配置zsh

与 bash 的 .bashrc 一样,zsh 使用点文件 .zshrc 来存储用户配置设置。 保存在主目录 (~/.zshrc) 中。 默认情况下不会设置配置文件,因此您必须在主目录 (~/.zshrc) 中创建一个。

同样,您可以将 .zprofile 文件添加到您的主目录。 .zprofile 是将在登录时运行的脚本。 您可以添加任何您希望在启动新的 shell 实例时运行的命令。 鉴于 zsh 中可用的广泛自定义,使用专用配置管理器可能会有所帮助。 存在许多选项,包括 价钱, >哦,我的ZSH及 抗原.

哦,我的ZSH

要安装 Oh My ZSH,运行

curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | SH

这将下载可执行的 shell 脚本并将其安装在您的系统上。 安装 Oh My ZSH 后,默认设置是一个很好的起点。

默认情况下,它将安装“robbyrussell”主题(其同名来自项目的原始开发人员)。

此外,它将安装几个有用的插件。 至少终端显示的几个方面会立即出现不同。

git分支

与上述类似,Oh My ZSH 还添加了一个插件,可以显示您在 git 项目中所在的当前分支。 在命令提示符中出现在工作目录之后,您将始终知道您在哪个分支上。 这样,你永远不必 git 分支来知道当前的分支。 git 插件还添加了其他几个有价值的功能。

在下面的示例中,项目目录当前位于测试分支上。 我们还可以知道工作树是干净的,没有您未提交的更改。 在这种情况下,显示为绿色表明了这一点。 一旦您做出更改,显示就会变成另一种颜色,这意味着有新的更改要提交:

bash 与 zsh

zsh 在命令提示符中通过这些类型的指示显着改进了 Git 工作流程。

改变主题

如上所述,zsh 带有数百个不同的主题。 robbyrussell 将是默认主题,尽管您可以轻松更改它。 要查找 Oh My ZSH 提供的新主题,请在 主题页面 在项目回购中。 鉴于可用的选择众多,您很可能会找到一款几乎完全符合您所寻找的功能的产品。

找到喜欢的文件后,在主目录中打开 .zshrc 文件。 然后,您需要更新以 ZSH_THEME 开头的行。 输入您要使用的名称(在引号内),然后保存文件。 打开一个新的终端会话现在应该显示新的主题。

bash 与 zsh

您甚至可以将随机设置为您的 ZSH_THEME。 每次您在 shell 中打开一个新会话时,这将加载一个新的随机主题。

一些主题,例如流行的 Powerline 字体,可能需要额外的包或字体。 不过,主题的安装说明应指定所需的任何其他包。

结论

正如我们在这篇 zsh vs. bash 文章中看到的那样,zsh 和 bash 共享一系列相似且令人印象深刻的功能,但也有其特定的工具。 如果您正在寻找 bash 中没有的可扩展性、更好的自定义和高级功能,那么结合 Oh My Zsh 框架的 zsh shell 是一个很好的选择。 无论您选择什么 shell,提高命令行的流畅性都会在效率、自动化和更好地理解计算机内部工作方面带来无数好处。

有关一些基本 shell 命令的介绍,请查看我们关于 基本命令行用法.

wp引擎托管

 

安吉洛·弗里西纳阳光媒体

作者介绍

Angelo Frisina 是一位经验丰富的作家和数字营销专家,在该领域拥有超过 XNUMX 年的经验。 他擅长网页设计、应用程序开发、SEO 和区块链技术。

Angelo 对这些领域的广泛了解导致创建了多个屡获殊荣的网站和移动应用程序,并为广泛的客户实施了有效的数字营销策略。

Angelo 还是一位受人尊敬的顾问,通过各种播客和在线数字营销资源分享他的见解和专业知识。

Angelo 热衷于紧跟数字世界的最新趋势和发展,对于任何希望在数字领域保持领先地位的组织来说都是一笔宝贵的财富。

38 评论

  • MSI 九月28,2018 7时:下午58

    “ bash(“ Bourne-again shell”的缩写)是基于Unix的操作系统的默认外壳……”

    这不是真的。 Bash是大多数Linux发行版和macOS上的默认交互式shell,是的。 但是,它不是我遇到的任何BSD变体的默认值,甚至不是基本系统中的值。 Unix等商业Unix系统也不使用Bash。

    同样,Linux不是基于Unix的(基于原始Unix代码),而是类似Unix的(根据Unix的工作方式设计)。

  • 尼古拉斯·莫雷拉(Nicholas Morera) 十月13,2018 9时:下午33

    感谢您指出了这一点。 该帖子已更新以反映这一点。

  • 约翰·F 十月25,2018 3时:下午11

    此处提到的zsh的许多优点也可以通过bash-it用于bash https://github.com/Bash-it/bash-it

  • 尼古拉斯·莫雷拉(Nicholas Morera) 十月25,2018 6时:下午46

    确实如此,尽管如README.md所述,这是“ oh-my-zsh的无耻剥夺”🙂

  • 蓝光71 十二月12,2018 3在:上午33

    注意,Bash还具有上面列出的一些功能(配置时):

    –'z'实用程序与Shell无关,可在Bash和Zsh上使用。 我一直在Bash中使用它。 看这里 https://github.com/rupa/z/

    –在安装了bash-completion并正确配置了inputrc之后,可以将Bash设置为具有Zsh AUTO_MENU,例如完成(包括选项循环)。

    –`cdspell`和`dirspell`选项将在Bash中进行自动文件系统名称更正

    –目录和文件可以通过Bash中的LS_COLORS变量配置为不同的颜色

    –命令单击URL是终端功能。 在iTerm2中,我可以对URL进行COMMAND + CLICK并启动浏览器。

    我在这里讨论了许多Bash功能和设置: https://bluz71.github.io/2018/03/15/bash-shell-tweaks-tips.html

    Bash可以完成Zsh的90%的工作,只需要进行一些调整即可。

    Zsh确实具有Bash所没有的一些不错的功能,它们是:

    –右侧提示(如果需要)

    –命令语法突出显示

    –描述性的制表符完成(派生手册页)

    干杯。

  • ry__ 十二月21,2018 3时:下午20

    “……除非您输入pwd”,这不是真的。 快速浏览手册页中的bash / ksh并搜索(/像vi)以查找PROMPTING。 在这里,您将找到如何设置提示的信息(PS1是主要提示,PS2..4还有其他针对不同用途的提示)。 具体来说,您想输入的信息是-/ w给出路径。

    但是,与OMZ相比,自定义范围非常有限。

  • minime 二月14,2019 1时:下午40

    该单击并打开是终端仿真器的功能,而不是zsh的功能。 选项完成和z命令也是zsh的插件,它们也以类似的形式可用于bash。 bash还内置了文件的颜色高亮显示。

  • Shreyas 四月1,2019 6在:上午34

    为什么我可以编辑此博客?

  • 柏陈 四月3,2019 9在:上午06

    感谢您的帖子,我非常喜欢`z`命令,不知道这个插件!
    顺便说一句,您正在为您的div设置contenteditable =“ true”,而不是像`h2'这样的标题

  • 安吉洛·弗里西纳(Angelo Frisina) 四月9,2019 8时:下午16

    您如何编辑博客?

  • 安吉洛·弗里西纳(Angelo Frisina) 四月9,2019 8时:下午25

    感谢您的反馈Phat Tran。

  • 特里克斯·法拉(Trix Farrar) 四月29,2019 12时:下午34

    “随着7年版本1979 Unix的发布,新的操作系统以bash作为其默认shell发行了。”

    这句话是不正确的。

    版本7(和后续的UNIX品牌的操作系统)中的默认外壳是Bourne Shell。

    bash由Brian Fox创建于1989年,是GNU项目的一部分。 (https://en.wikipedia.org/wiki/Bash_(Unix_shell))

  • 帕瓦莫 五月10,2019 4时:下午42

    谢谢。 我正在阅读文章,对自己说:“这是错误/不正确/不相关”。 我希望作者根据您的评论来更新帖子。 否则,它只是表明他们对壳知之甚少...

  • 斯蒂芬· 六月4,2019 1在:上午56

    “…除非您输入pwd”,否则根本不正确! 大多数Linux发行版和(我很确定)macOS都将PS1设置为有用的东西,其中包括cwd。 每次需要查看自己所在的位置时,键入pwd都不是有效的工作流程,几乎没人能做到。

    本文将比较bash和zsh中的默认配置,而不是Shell本身的功能。

  • 吉姆 六月4,2019 12时:下午35

    好的,尝试了一下,它被倒在我的.bash_profile的每一行上。 我猜不太兼容。

    另外,我很确定/ bin / sh自从使用了15年以来,它同样具有可编写脚本的功能。 好吧,那是ksh。

  • 皮特 六月4,2019 4时:下午20

    不错的向导! 由于苹果宣布将在卡塔利娜(Catalina)改用ZSH,因此该条目即将爆炸。 🙂

  • 布鲁诺 六月4,2019 7时:下午35

    示例中使用的主题是什么?

  • 克里斯 六月4,2019 11时:下午59

    这是一篇不错的文章。 但是,这里仅列出了几个在bash中真正不可用的zsh功能(除非您使用的是macOS的旧版bash)。

    例如,选项卡自动完成功能可在bash中使用。 如本文所述,您并不了解cd命令的完整路径。 如果您愿意浏览不完全了解的级别,则只需知道部分目录和文件名即可。

    如果说bash不会在提示符下显示当前工作目录(默认情况下,zsh也不显示,但是很容易修改它们以显示该信息),或者bash在git上不能很好地运行,这也是一种误导包。

    我并不是说这些东西等同于它们的zsh对应物。 它们不是,许多人更喜欢zsh变体。 我的意思是说,我觉得这篇文章不那么引人注目,因为谈话的重头戏似乎像个稻草人。 也许您可以在打印bash之前就避开了bash爱好者,以便他们可以帮助您消除误导性的问题。

    另一方面,zsh所做的某些事情确实不是bash的一部分,您甚至都没有涉及,例如递归路径扩展,它允许您键入“ cd / u / sh / cal”并使它自动执行。展开为“ cd / usr / share / calendar”。

    zsh的突出功能似乎是其内置的可定制性。 例如,如果您运行类似“ set -o | grep'on | off'| wc”,您会发现zsh中公开了179个shell选项,而bash中只有27个。

    就像我说的,好东西。 下次,也许在说bash不能做什么之前,先将您的东西交给bash爱好者。

  • 麦克·麦克斯韦 六月5,2019 1在:上午53

    我发现非常有用的一点是将stderr设置为红色,而stdout设置为黑色。 当然,可以使用单个命令在bash中(我假设在zsh中)执行此操作,但是在会话中执行此操作似乎更困难。 我有一个perl脚本,它在启动时就开始执行此操作,但这似乎就像用大锤杀死苍蝇一样。 这里还有一些其他解决方案: https://unix.stackexchange.com/questions/12439/can-i-configure-my-shell-to-print-stderr-and-stdout-in-different-colors。 但是令我惊讶的是,这在某些shell或其他外壳中不是标准的(我来这里是希望它与zsh一起出现……)。

  • 史蒂夫·西蒙斯 六月5,2019 7时:下午27

    传统的Unix Shell是由Steve Bourne而非Ken Thompson编写的,因此bash被称为“ Bourne-again”外壳。

  • 彼得·伯奇 六月6,2019 1在:上午59

    您的bash短历史记录不正确。 1979年取代Thompson外壳的外壳是Bourne Shell(sh),而不是BASH。 原始的Bourne Shell(sh)与BASH不同。 BASH直到1989年随GNU项目一起到达。 (https://en.wikipedia.org/wiki/Bourne_shell)

  • Badbanana 六月6,2019 3在:上午28

    除了“ z filepath”命令,其他所有内容都可以在bash中使用。

    当真正替代bash时唤醒我。

  • 罗伯特·埃克斯滕 六月6,2019 7时:下午29

    您的历史课程中有几个错误。

    Bash肯定没有在1977年发布。正如其他人所指出的那样,您将Bash和Bourne shell混淆了(不是同一回事)。 Research UNIX发行的是Bourne shell。 在UNIX编程环境中从未提及Bash。 那本书是在Bash编码之前5年出版的。

    有关安全性的注意事项:

    您认为Zsh提供更好的安全性的依据是什么? 正如您所提到的,Bash多年来一直未发现漏洞,但是什么使您认为Zsh没有未发现的安全漏洞? 我认为您没有提供Zsh比Bash更安全的任何正当理由。

  • 凯特·艾伯纳特 六月7,2019 12在:上午08

    Bash肯定不是随版本7 Unix一起发布的。 Bash是GNU项目,于1989年首次发布。

  • 阿亚兹 六月9,2019 10时:下午27

    powerlevel9k使用什么颜色主题?

  • 李晶 六月21,2019 8时:下午15

    感谢您对这篇文章的建设性反馈。 该帖子已更新,以反映您的评论。

  • 李晶 六月21,2019 8时:下午16

    感谢您指出此错误,Trix Farrar。 该帖子已更新,以反映您的评论。

  • 李晶 六月21,2019 8时:下午18

    感谢克里斯(Chris)对bash的有用见解并分享您的疑虑。 该帖子已更新,可以根据您的评论更准确地显示bash和zsh。

  • 李晶 六月21,2019 8时:下午19

    彼得·伯奇,感谢您指出此错误。 该帖子已更新,以反映您的评论。

  • 李晶 六月21,2019 8时:下午20

    感谢您指出此错误并与帖子Robert Eksten分享您的疑虑。 该帖子已更新,以反映您的评论。

  • 李晶 六月21,2019 8时:下午21

    谢谢您指出这个错误,Kate Ebneter。 该帖子已更新,以反映您的评论。

  • 李晶 六月21,2019 8时:下午22

    谢谢您的积极反馈,皮特! 该帖子最近已更新,以反映有关macOS Catalina的新公告。

  • 安吉洛·弗里西纳(Angelo Frisina) 十月11,2019 6时:下午13
  • 罗伯特 十月19,2019 9时:下午32

    哈哈只是有一个良好的时间阅读评论...由于所有的Unix工具各地的近40年来,每一个都是一种生活方式,而不是一个简单的工具。 我相信您甚至可以将DOOM移植到bash或ZSH或SendMail或Vi。

  • 安吉洛·弗里西纳(Angelo Frisina) 十月19,2019 10时:下午02

    是的,Robert很好。 感谢您分享您的想法。

  • fsc137 二月21,2020 8时:下午52

    至少他们没有将tcsh设置为默认值。
    苹果最好不要使bash不可用。

  • Tom 十一月3,2021 12时:下午59

    这里没有提到 bash 和 zsh 之间的一个主要区别。 这是命令历史记录的保存方式。
    当您有多个 bash 的 open only 命令输入到第一个打开的命令中时,将记录到历史文件 (.bash_history) 中,该文件仅在第一个 shell 终止后才写入磁盘。 (如果我在这里错了,请纠正我。)
    因此,换句话说,不会记录输入到第二个 bash 中的命令。
    zsh 将所有打开的 zsh 上的所有命令与时间戳一起记录到历史文件 (.zsh_history) 中。
    这才是正确的会计! 😉

    那和“花哨的颜色”(我正在使用 oh_my_zsh :-D)是我转换的原因。

  • 安吉洛·弗里西纳(Angelo Frisina) 十一月4,2021 6时:下午00

    感谢您的反馈!