原文: Linux Shells for Beginners – Bash, Zsh, and Fish Explained

当你打开终端时,很可能发现终端使用 Bash 作为其 UNIX shell 环境。当然除了 Bash,还存在其他“shell”环境。

例如 C ShellKorn ShellZ Shell,甚至 Fish Shell。不同的 shell 环境各有千秋,在你选择自己系统的 shell 之前,你应该评估一下。

我将在本文中介绍一些流行的 shell 及主要功能,帮助你做选择。

Bash Shell

Bash Shell(或 Bourne Again Shell)是一种 UNIX shell 和命令语言。它是由 Brain Fox 为 GNU 项目编写的,目的是作为 Bourne Shell (sh) 的免费软件替代品。

Bash 于 1989 年首次发布,它是大多数 Linux 发行版的默认 Shell 环境。其他发行版,如 Kali Linux,使用 Z Shell 作为默认 shell。

Bash 是 Linus Torvalds(Linux 的创建者)移植到 Linux 的首批程序之一。

Bash

这是以上图片的来源

你应该记住 Bash 也是一种编程语言。所以它即是一个“Shell”,同时你也可以使用 Bash 对行为进行编程,例如,Bash 中的"Hello World"程序:

#!/bin/bash
echo "Hello World"

Bash 的关键点

  • 因为 Bash 是大多数系统上的默认 shell 环境,大多数用户使用它。
  • Bash 没有内联通配符表达式。通配符表达式是当你想要在 Shell 中搜索模式(pattern)的时候使用,类似于正则表达式(Regex)。三个主要的通配符是 *?[]
  • 不能自动更改目录名称。
  • # 在脚本中被视为注释。
  • 它有shopt(shell option 缩写)设置。
  • 提示符(prompt)有反斜杠转义。
  • 用户配置设置在 .bashrc 中。

Z Shell

Z Shell 又称 Zsh, 是一个与 Bash 非常相似的 UNIX shell。你还可以使用 Zsh 编写脚本并将 shell 用作命令解释器。

Zsh 是 Bourne shell 的扩展,因此在此之上很多改进。 Zsh 于 1990 年由 Paul Falstad 发布,它具有 Bash、Korn Shell 和 C Shell 共有的一些功能。

macOS 默认使用 Zsh Shell。

Zsh Shell

这是以上图片的来源

Zsh 的关键点

  • 在终端使用时,Zsh 带有自动补全功能。因此,当你按下Tab↹以自动补全你想运行的任何命令时,它不仅为你自动补全,而且弹出下拉菜单,包含所有其他可能的文件和目录。

Zsh Toggle

  • 支持内联通配符表达式
  • 比 Bash 可配置度更高
  • 支持插件和主题。这里是 Zsh 的插件清单

同时,还有围绕 Z Shell 构建的框架。最受欢迎的框架之一是Oh My Zsh,它是一个社区驱动的开源框架,用于管理 Zsh 配置。(我用 Oh My Zsh😄)

Oh My Zsh

这是以上图片的来源

Zsh 和 Oh My Zsh 很相似,但并不完全相同。重申一下,Oh My Zsh 是一种管理 Zsh 配置的方式,它不是 Shell 本身。

Fish Shell

Fish 是一个强调交互性和可用性的 UNIX shell 环境。与 Zsh 不同,Fish 旨在为用户提供交互性,而不是信任用户实现自己的配置。

它由 Axel Liljencrantz 于 2005 年创建。由于不符合 POSIX shell 标准,Fish 被认为是“奇异的 shell”。 [[资料来源](https://en.wikipedia.org/wiki/Fish_(Unix_shell)]

Fish Shell

这是以上图片的来源

Fish 的关键点

  • Fish 根据你的命令历史记录和所在目录提供“键入时搜索”自动建议。与 Bash 的历史搜索类似,Fish Shell 的搜索历史始终处于打开状态。这样,用户终端工作时能够获得交互式反馈。

Fish autocomplete

这是以上图片的来源

  • Fish 还倾向将功能作为命令而不是语法。这使得功能的选项和帮助文本可见。
  • 由于默认情况下 Fish 已经预置了很多配置,因此它被认为比 Zsh 等其他 sh 选项更适合初学者。
  • Fish 的脚本语言不同于 Zsh 和 Bash。 Zsh 使用更多简化指令(alias),而 Fish 避免在脚本语言中使用简化指令。

如果你只是使用基本命令(如 cdcpvimssh 等)编写脚本,你将不会注意到 Fish 和 Bash 的脚本语言的工作方式有何不同。

两者最大的区别之一是当你尝试捕获命令的输出时。在 Bash 中你可能习惯于这样:

todays_date=$(date)
echo "Todays date is $todays_date"

Output

Todays Date is Tue Dec 13 15:29:28 CST 2022

而在 Fish 中,捕获输出的方式不同。Fish 脚本等价物如下:

set date (date)
echo "Todays Date $date"

ezgif.com-gif-maker

todays date is Tue Dec 13 21:35:03 UTC 2022

总结

Bash、Z Shell 和 Fish Shell 各有优点,也有一些相似之处。既然对它们有了更多的了解,你就可以在工作中更有效地使用它们。

如果你想要更可配置的 shell,你可以使用 Zsh(甚至安装 Oh My Zsh)。如果你想要更多交互的终端体验,同时不需要大量配置,你可以使用 Fish Shell。如果你想要经典的感觉,你可以保留 Bash。

选择取决于你作为开发人员的偏好 - 所以只需选择最适合你的 shell。

希望这对篇文章对你有所帮助!感谢阅读 🐚🐚🐚