Zsh 常用快捷键(基于 macOS)
控制键(Ctrl, ⌃)快捷键
| 快捷键 | 功能说明 | 
|---|---|
| ⌃ + U | 清空当前行 | 
| ⌃ + A | 移动到行首 | 
| ⌃ + E | 移动到行尾 | 
| ⌃ + F | 向前移动 | 
| ⌃ + B | 向后移动 | 
| ⌃ + P | 上一条命令 | 
| ⌃ + N | 下一条命令 | 
| ⌃ + R | 搜索历史命令 | 
| ⌃ + Y | 召回最近删除的文字 | 
| ⌃ + H | 删除光标前的字符 | 
| ⌃ + D | 删除光标所在字符 | 
| ⌃ + W | 删除光标前的单词 | 
| ⌃ + K | 删除从光标到行尾的内容 | 
| ⌃ + T | 交换光标与前一个字符的位置 | 
| ⌃ + L | 清屏(等效于 clear 命令) | 
    
命令键(Command, ⌘)快捷键
| 快捷键 | 功能说明 | 
|---|---|
| ⌘ + Click | 打开文件、文件夹或链接 | 
| ⌘ + N | 新建终端窗口 | 
| ⌘ + T | 新建标签页 | 
| ⌘ + W | 关闭当前标签页 | 
| ⌘ + 数字 | 切换标签页 | 
| ⌘ + ←/→ | 左右切换标签页 | 
| ⌥⌘ + 数字 | 切换终端窗口 | 
| ⌘ + Enter | 切换全屏 | 
| ⌘ + D | 左右分屏 | 
| ⇧⌘ + D | 上下分屏 | 
| ⌘ + ; | 自动补全历史记录 | 
| ⇧⌘ + H | 自动补全剪贴板历史 | 
| ⌥⌘ + E | 查找所有内容以定位标签页 | 
| ⌘ + R | 清屏(与 ⌃ + L 相同) | 
| ⌘ + / | 显示光标位置 | 
| ⌥⌘ + B | 启用历史回放 | 
| ⌘ + F | 查找终端内容并使用 Tab/⇧Tab 补全 | 
Zsh 是什么
Zsh(Z Shell)是一个功能强大的交互式 Shell,由 Paul Falstad 于 1990 年创建。它兼容 Bash,大部分 Bash 命令和脚本都能在 Zsh 中运行。与注重可移植性的 Bash 不同,Zsh 强调用户体验,提供智能补全、拼写纠正、可定制提示符和丰富的插件生态。
Bash(Bourne Again Shell)是 GNU 项目的一部分,于 1989 年发布,重点在于 POSIX 标准的兼容性和跨平台一致性。
从 macOS Catalina 开始(2019),Apple 将 Zsh 设为默认登录 Shell。原因主要包括:
- macOS 自带的 Bash 版本仍停留在 3.2(受限于 GPLv2 许可);
 - Apple 避免使用 GPLv3 授权软件;
 - Zsh 拥有更自由的 MIT 许可和更现代的交互体验。
 
因此,Apple 鼓励用户向 Zsh 迁移。
Zsh 的特性(相比 Bash )
快速定制提示符
Zsh 比 Bash 提供更灵活的提示符配置方式。示例如下:
Bash:
PS1="\[\033[32m\]\u@\h \[\033[34m\]\w \[\033[0m\]\$ "
PS1是 Bash 中的一个 环境变量,表示 主提示符(Primary Prompt String),即你在终端里输入命令前看到的那一行提示。在 Zsh 中,则是PROMPT / PS1。
Zsh:
PROMPT="%F{green}%n@%m %F{blue}%~ %f$ "
Zsh 支持 %n(用户名)、%m(主机名)、%~(当前目录)等,并可结合 Oh My Zsh 等插件系统实现主题和状态提示,非常适合个性化定制。
原生支持关联数组
Zsh 和 Bash 4.0+ 都支持关联数组,但 Zsh 在兼容性和语法上更灵活。
Zsh 示例:
typeset -A my_assoc_array
my_assoc_array[key1]=value1
echo $my_assoc_array[key1]
Bash 示例(仅限 4.0+):
declare -A my_assoc_array
my_assoc_array[key1]=value1
echo "${my_assoc_array[key1]}"
Zsh 允许更多类型作为键,默认数组索引从 1 开始(可改为 0)。
扩展的通配模式(glob)
Zsh 支持更强大的 glob 模式匹配:
Zsh 启用扩展 glob:
setopt extended_glob
txt_files=(*.txt)
non_log_files=^(*.log)
Bash 等效:
shopt -s extglob
txt_files=(*.txt)
non_log_files=!(*.log)
Zsh 还支持 **/ 进行递归目录匹配、排除匹配(~ 或 ^),操作灵活直观。
高级参数扩展
Zsh 支持间接变量引用和字符串处理的高级语法。
间接引用:
Zsh:
name=USER
USER=Alice
echo ${(P)name}  # 输出 Alice
Bash 中则为:
name=USER
USER=Alice
echo "${!name}"  # 输出 Alice
字符串处理(Zsh):
file="archive.tar.gz"
echo ${file:r}   # 输出 archive.tar
echo ${file:e}   # 输出 gz
Zsh 的参数扩展语法更丰富,适合写简洁高效的脚本。
Zsh 还是 Bash?
| 比较维度 | Zsh | Bash | 
|---|---|---|
| 默认系统支持 | macOS Catalina+ 默认 Shell | 大多数 Linux 默认 Shell | 
| 可移植性 | 略逊于 Bash(不一定预装) | 高,跨平台兼容性强 | 
| 脚本语法 | 丰富灵活,非 POSIX 兼容特性多 | 更贴近 POSIX 标准 | 
| 插件生态 | 丰富(Oh My Zsh、zinit、Prezto) | 相对较少 | 
| 定制体验 | 极强(主题、补全、提示符) | 较弱 | 
| 上手难度 | 稍高 | 易于入门 |