ZSH 和 BASH 有什么区别?

2023-11-09

当我们浏览类 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 之间的主要区别

  1. 交互式用户体验
  2. Zsh 提供卓越的交互使用。例如,它提供了改进的选项卡补全功能。当有多个选项需要完成时,它将显示一个可以导航的列表,而不是像 Bash 那样循环浏览选项。

    Bash:

    cd D<tab><tab> 
    
    Desktop/ Documents/ Downloads/
    

    Zsh:

    cd D<tab> 
    
    Desktop/ Documents/ Downloads/
    

  3. 命令自动更正
  4. Zsh 可以建议对拼写错误的命令进行更正,而 Bash 没有此功能。

    Zsh:

    ectho hello 
    zsh: correct 'ectho' to 'echo' [nyae]? y
    hello
    

  5. 扩展通配符
  6. Zsh 具有卓越的通配能力。它允许您使用通配符来匹配文件名或字符串。例如,您可以使用 ** 匹配所有子目录中的文件。

    Bash:

    echo *.txt 
    
    file1.txt file2.txt
    

    Zsh:

    echo **/*.txt 
    
    dir1/file1.txt dir1/file2.txt dir2/file3.txt
    

  7. Arrays
  8. 在 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
    

  9. 默认外壳
  10. 在 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,请记住,了解环境的细节可以显着提高您的工作效率并使任务变得更加愉快。快乐编码!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ZSH 和 BASH 有什么区别? 的相关文章

  • adb shell:无法使用 ESCAPE 键

    I want to use vi when running adb shell Starting vi is easy However I found that the ESC key doesn t seem to get through
  • Bash 和双引号传递给 argv

    我重新设计了这个示例以使其简单 但我想做的是在 bash shell 执行它时获取一个嵌套双引号字符串作为单个 argv 值 这是脚本示例 set x command1 key1 value1 key2 value2 key3 value3
  • awk 返回两个变量

    现在这就是我正在做的事情 ret ls la awk print 3 9 usr echo ret awk print 1 fil echo ret awk print 2 问题是我没有运行ls我正在运行一个需要时间的命令 因此您可以理解其
  • Python bash 管道

    我想将 python 脚本的输出通过管道传输到 bash 脚本 到目前为止我所做的是尝试使用os popen sys subprocess 并试图给出一个管道的例子 os popen echo P 1 1 591336 4927369 1
  • 使用运算符 j 操作 zsh 数组

    以下代码摘自here http eseth org 2010 git in zsh html function vi git st local ahead behind remote local a gitstatus Are we on
  • Bash - 比较 2 个文件列表及其 md5 校验和

    我有 2 个列表 其中包含带有 md5sum 检查的文件 即使文件相同 列表也具有不同的路径 我想检查每个文件的 md5 和 我们正在讨论数千个文件 这就是为什么我需要脚本来仅显示差异 第一个列表是普通列表 第二个列表是文件的当前状态 我想
  • 使用 grep 查找所有匹配的模式

    In txt1 S01A1P2 S01A1P5 S01A1P4 In txt2 data train wave S01A1P3 mfc data train wave S01A1P7 mfc data train wave S01A1P8
  • 在 bash 中,如何除以两个变量并输出四舍五入到小数点后 5 位的答案? [复制]

    这个问题在这里已经有答案了 我将两个变量作为输入 将它们相除后 我希望将输出四舍五入到小数点后 5 位 我已经尝试过这种方法 gt sum 12 n 7 output scale 5 sum n bc echo output 我的代码没有显
  • Docker exec linux 终端创建别名

    我有一个正在运行且独立的容器 我想在附加到该容器之前创建一个命令别名 当我连接到容器并输入 alias bar foo 创建别名 并可以通过以下方式检查 alias command 但如果我想做同样的事情码头执行者命令即这样 docker
  • 带有二进制数据的 Bash echo 命令?

    有人可以解释一下为什么这个脚本有时只返回十六进制字符串表示形式的 15 个字节吗 for i in 1 10 do API IV openssl rand 16 API IV HEX echo n API IV od vt x1 w16 a
  • wget 并行下载文件并重命名

    我有一个包含两列的文本文件 第一列是要保存的名称 第二列是资源的 url 地址 10000899567110806314 jpg http lifestyle inquirer net files 2018 07 t0724cheekee
  • 用于获取特定用户 ID 和进程数的 Bash 脚本

    我需要 bash 脚本来计算特定用户或所有用户的进程 我们可以输入 0 1 或更多参数 例如 myScript sh root deamon 应该像这样执行 root 92 deamon 8 2 users has total proces
  • 使用 IFS bash 进行 CSV 解析:选择“;”作为分隔符

    我有一个包含 130 列的 CSV 我需要用它来做 3 个 csv 我用 while 和 IFS 循环 因为我需要对每一行的变量进行一些处理 这是我所做的 while IFS read my 130 vars what i do with
  • 如何在 bash_profile 文件中添加导出语句?

    我正在尝试了解是否必须添加导出语句来在 bash profile 文件中设置变量 我该怎么做呢 例如 如果我必须添加 export AX name 那么我应该将其简单地写在文件末尾还是我还需要编写其他内容 简单写一下export AS na
  • sed 和 rev shell 命令转换为 Python 脚本 [重复]

    这个问题在这里已经有答案了 有一个shell命令 我正在尝试将逻辑转换为python 但我不知道该怎么办 我需要一些帮助 shell命令是这样的 cd tests src main test ls find name vrlp while
  • tcsh 脚本 if 语句

    我需要循环遍历一堆不同的场景 变量场景 但无法弄清楚如何在 tcsh shell 脚本中使用 if 语句 收到错误 if 表达式语法 有人可以告诉我我有什么问题吗 简化代码如下 谢谢 bin tcsh f set val 0 foreach
  • 如何使用 nohup 获取正在运行的程序列表

    我正在通过 SSH 连接访问运行 CentOS linux 发行版 的服务器 由于我无法始终保持登录状态 因此我使用 nohup command 来运行我的程序 我找不到如何获取我开始使用 nohup 的所有程序的列表 工作 只有在我注销之
  • 无法从 bash 脚本使用 nvm

    我正在尝试编写一个 shell 脚本来自动设置我的开发环境 安装 python nvm node mongo 等 我正在使用 nvm 来安装 Node js 它告诉您关闭并重新打开终端以开始使用 nmv 命令 我尝试获取 bashrc 和
  • 批量检测系统是32位还是64位

    有谁知道如何创建一个批处理文件 如果是 64 位系统 可以对一个程序进行 shell 处理 如果是 32 位系统 则可以对另一个程序进行 shell 处理 检查 PROCESSOR ARCHITECTURE being x86 if PRO
  • Python 子进程:无法转义引号

    我知道以前曾问过类似的问题 但它们似乎都是通过重新设计参数的传递方式 即使用列表等 来解决的 但是 我这里有一个问题 因为我没有这个选项 有一个特定的命令行程序 我使用的是 Bash shell 我必须向其传递带引号的字符串 它不能不被引用

随机推荐

  • 某电商在线奶粉销量数据分析-SQL+Tableau自动化分析

    本文数据集来源 Baby Goods Info Data 数据库 MySQL 数据库管理软件 DataGrip 可视化分析软件 Tableau 本文sql文件 可视化分析源文件地址 DataScience 文章目录 数据预处理与导入 导入数
  • tomcat部署、tomcat虚拟主机及tomcat多实例、tomcaty优化

    目录 一 Tomcat概述 tomcat是什么 什么是 servlet 什么是 JSP Tomcat 功能组件结构 Container 结构分析 Tomcat 请求过程 二 Tomcat部署 1 关闭防火墙和selinux 并将Tomcat
  • sprintf函数的用法

    说明1 该函数包含在stdio h的头文件中 使用时需要加入 include
  • 测试经验小谈

    一 注意事项 新建一条数据时 如果有数据新建的时间 注意核对是否与当前时间相同 告知开发要进行测试 让开发停止提交代码 包证当前测试的结果只针对当前版本 准确定位BUG 同时 防止引入新的BUG 关于断网测试 明确当前的软件是否需要断网测试
  • 自动化测试 —— Pytest测试框架

    01 简介 Pytest是一个非常成熟的全功能的Python测试框架 主要有以下特点 简单灵活 容易上手 文档丰富 支持参数化 可以细粒度地控制测试用例 支持简单的单元测试与复杂的功能测试 还可以用来做Selenium Appium Req
  • ubuntu 上安装 oprofile

    1 wget http prdownloads sourceforge net oprofile oprofile 0 9 6 tar gz 2 tar zxf oprofile 0 9 6 tar gz 3 configure check
  • win10计算机管理不可用,win10管理员被禁用怎么办,win10怎么管理员运行

    Win10家庭版出现了Windows Defender 安全中心提示 windows defender 页面不可用 你的IT管理员已经限制对此应用一些区域的访问 你尝试访问的项目不可用 有关详细信息 请与你的IT支持人员联系 话说电脑基本都
  • flask启动mysql报错:1287, @@tx_isolation' is deprecated and will be removed in a future release. Please u

    首先 这只是一个警告 不是报错 并不会影响项目运行 如果项目启动不了 应该是别的地方出问题了 解决办法 在当前python版本的依赖包里找到sqlalchemy dialects mysql里的base py文件修改源码 例如我的 C Us
  • 计算机丢失msvcp110.dll是什么意思?如何修复?

    在修复msvcp110 dll文件的过程中 我经历了一些挑战 但也获得了一些宝贵的经验和感悟 首先 我意识到在遇到msvcp110 dll错误时 不要恐慌 这个问题并不是无解的 只要我们能够采取正确的方法和步骤 很有可能解决它 其次 我学会
  • 共用一块存储union

    2017 02 14 举一个不恰当的例子 你想用二叉树来做表达式树 但是里面既有运算符又有运算数 但是存储节点里面只能有一种类型 不过好在这个还好分析 那就是我只需要判断他是不是叶子就可以知道这个节点里的存储信息 就可以用union的方式来
  • JAVA项目开发之文档篇

    项目开发过程中为了增加程序的可读性和程序的健壮性 方便后期程序的调试和维护 所以需要在开发过程中统一技术规范 一般会在项目初期确定好相关文档作为这一统一的规范 不同公司会对文档做不同要求 划不同的分类 但一般来说 或者拿自己的经验说 大致可
  • loadrunner解决“服务器正在运行中”方法

    loadrunner解决 服务器正在运行中 方法 问题现象 这个问题在上家公司遇见过 今天无意中找到了解决办法 解决方法 打开任务管理器 找到这个进程 ThumbProcess exe 关掉这个进程即可解决
  • SQLi LABS Less-30

    第30关使用GET请求传递参数 在url中构造payload即可 后端源码中并没有做什么过滤 只是在参数两边添加了双引号 输入 1 and true a 页面正常显示 输入 1 and false a 页面空显示 由此可证明存在SQL注入
  • 如何使用 RVM 在 CentOS 和 RHEL 上安装 Ruby 2.1.8

    Warning Ruby 2 1 is reached to end of life and no more maintained Kindly use below tutorials to install latest version o
  • Linux 中的 /etc/mtab 文件是什么

    The etc mtab文件是Linux操作系统中的一个重要组成部分 它包含当前挂载的文件系统的记录 包括设备名称 挂载点和文件系统类型 各种 Linux 命令和实用程序使用此文件中的信息来确定已安装文件系统的状态 etc mtab 文件是
  • 在 Linux 上设置 HTTP 代理:基本指南

    在当今互联的世界中 网络在我们的数字生活中发挥着至关重要的作用 许多 Linux 用户必须处理的网络的一个重要方面是设置 HTTP 代理 本文将指导您完成在 Linux 系统上配置 HTTP 代理的过程 什么是 HTTP 代理 在深入了解该
  • Git Reset:带有示例的综合指南

    Git 是任何软件开发人员不可或缺的工具 它提供了管理和跟踪源代码更改的有效方法 在它的各种命令中 git reset 是一个功能强大的命令 它有助于浏览项目的历史记录 更改提交 甚至丢弃更改 尽管它很实用 但理解起来可能有点混乱 尤其是对
  • 关于将 WordPress 网站迁移到 HTTPS 您需要了解的一切

    Google has been pretty adamant in its efforts to make the web more secure First by proposing that web browsers should st
  • 如何使用 JavaScript forEach() 方法

    JavaScript forEach 方法对数组中的每个元素运行一次 例如 导航到数组并对每个数组元素执行任何操作 JavaScript forEach 方法在这种情况下很有用 JavaScript forEach 方法使用以下语法 arr
  • ZSH 和 BASH 有什么区别?

    当我们浏览类 Unix 操作系统的世界时 我们会遇到不同的 shell 环境 每个环境都有其独特的特性和功能 两种常用的 shell 环境是 Bash Bourne Again Shell 和 Zsh Z Shell 在本文中 我们将深入探