当我们浏览类 Unix 操作系统的世界时,我们会遇到不同的 shell 环境,每个环境都有其独特的特性和功能。两种常用的 shell 环境是 Bash (Bourne Again Shell) 和 Zsh (Z Shell)。在本文中,我们将深入探讨这两种 shell,突出它们的差异,并尝试了解哪种更适合不同的场景。
什么是外壳?
在深入研究差异之前,我们先简要定义一下 shell 是什么。 shell 是允许用户与操作系统交互的接口。它可以是图形化的 (GUI) 或基于命令行的 (CLI)。 Bash 和 Zsh 是命令行 shell 的示例。
Bash(谍影重重外壳)
Bash是为 GNU 项目编写的自由软件 Unix shell。它被设计为 Bourne Shell(因此称为 Bourne Again Shell)的替代品,并包含 Korn shell 和 C shell 的功能。 Bash 是许多类 Unix 系统上的默认 shell,包括 Linux 发行版和 MacOS(直到版本 10.14 Mojave)。
Zsh(Z 外壳)
Zsh另一方面,它也是一个 Unix shell,被设计为交互式,并且包含其他 shell(例如 ksh 和 tcsh)的许多功能。它以其交互功能和改进的 shell 功能而闻名,例如拼写更正、cd 自动化、更好的数组处理等等。
Bash 和 Zsh 之间的主要区别
- 交互式用户体验
Zsh 提供卓越的交互使用。例如,它提供了改进的选项卡补全功能。当有多个选项需要完成时,它将显示一个可以导航的列表,而不是像 Bash 那样循环浏览选项。
Bash:
cd D<tab><tab>
Desktop/ Documents/ Downloads/
Zsh:
cd D<tab>
Desktop/ Documents/ Downloads/
- 命令自动更正
Zsh 可以建议对拼写错误的命令进行更正,而 Bash 没有此功能。
Zsh:
ectho hello
zsh: correct 'ectho' to 'echo' [nyae]? y
hello
- 扩展通配符
Zsh 具有卓越的通配能力。它允许您使用通配符来匹配文件名或字符串。例如,您可以使用 **
匹配所有子目录中的文件。
Bash:
echo *.txt
file1.txt file2.txt
Zsh:
echo **/*.txt
dir1/file1.txt dir1/file2.txt dir2/file3.txt
- Arrays
在 Zsh 中处理数组比在 Bash 中更容易、更直观。在 Zsh 中,数组开始于index 1,而在 Bash 中,他们从index 0.
Bash:
arr=(one two three)
echo ${arr[0]}
one
Zsh:
arr=(one two three)
echo ${arr[1]}
one
- 默认外壳
在 MacOS Catalina 之前,Bash 是 MacOS 上的默认 shell。但从 MacOS Catalina 开始,Zsh 是默认 shell。这一举措意义重大,因为它可能会导致 Zsh 得到更广泛的采用。
您应该使用哪一个?
这取决于个人喜好和工作流程的具体需求。如果您重视向后兼容性和广泛使用,Bash 是一个不错的选择。它是许多系统上的默认 shell,非常适合编写脚本。
另一方面,Zsh 非常适合那些欣赏更强大的交互式 shell 体验的人。凭借其高级自动更正、改进的通配符和更直观的数组处理等高级功能,Zsh 提供了更加用户友好的界面并且高度可定制。
另一件需要考虑的事情是可用的社区和资源。 Bash 较旧且被广泛采用,拥有大量在线可用的脚本、命令和资源。这些丰富的信息非常宝贵,尤其是在排除故障或尝试理解复杂的脚本场景时。
Zsh 虽然较年轻且不太流行,但已越来越受欢迎,尤其是在 Oh My Zsh 社区中。 Oh My Zsh 是一个开源的、社区驱动的框架,用于管理 Zsh 配置,它附带了许多有用的功能、帮助程序、插件和主题。
从 Bash 过渡到 Zsh
如果您正在考虑从 Bash 切换到 Zsh,您会很高兴知道过渡通常非常顺利。 Zsh 在很大程度上与 Bash 兼容,因为它的设计融合了 Bash 用户熟悉的许多功能和命令。这意味着您的大部分 Bash 脚本和命令历史记录应该可以在 Zsh 中运行。
但是,语法和行为方面存在一些差异,特别是在数组和模式匹配等更高级的功能方面,因此如果您要迁移复杂的脚本,请准备好进行一些修改。
结论
最后,您选择 Bash 还是 Zsh 在很大程度上取决于您的需求和偏好。 Bash 无处不在、可靠且非常适合脚本编写。 Zsh 具有先进的交互功能,对于那些在命令行上花费大量时间的人来说是一个强大的工具。
无论您选择哪种 shell,请记住,了解环境的细节可以显着提高您的工作效率并使任务变得更加愉快。快乐编码!