为什么 Zsh 值得学
Zsh 是功能最丰富的交互式 Shell 之一,开箱即用的补全、通配符和历史机制远超 Bash。本文整理日常高频使用的 Zsh 技巧,帮助你大幅提升命令行效率。
1. Tab 补全增强
Zsh 的补全系统是其最强大的特性,少量配置即可大幅提升体验。
大小写不敏感补全
bash
# 输入 pdf 也能补全 PDF 文件
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'
菜单选择模式
bash
# Tab 触发后用方向键在列表中挑选
zstyle ':completion:*' menu select
Fuzzy 匹配补全
bash
# 输入 fbr 也能补全到 foobar
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
补全缓存与颜色
bash
zstyle ':completion:*' use-cache on
zstyle ':completion:*' cache-path ~/.zcompcache
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
2. 历史搜索
前缀匹配(上下箭头)
bash
# 输入 git 再按 ↑,只看以 git 开头的历史命令
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey '^[[A' up-line-or-beginning-search
bindkey '^[[B' down-line-or-beginning-search
历史扩展操作符
| 语法 | 含义 | 示例 |
|---|---|---|
!! |
上一条完整命令 | sudo !! |
!$ |
上一条的最后一个参数 | mkdir foo && cd !$ |
!* |
上一条的所有参数 | echo a b c → print !* |
!pattern |
最近一条以 pattern 开头 | !git |
^old^new |
替换上一条中的文本 | ^foo^bar |
历史配置
bash
HISTSIZE=50000
SAVEHIST=50000
setopt HIST_IGNORE_ALL_DUPS # 去重
setopt HIST_IGNORE_SPACE # 空格开头不记录(适合敏感命令)
setopt SHARE_HISTORY # 多终端共享历史
3. 别名系统
Global Alias — 可出现在命令任意位置
bash
alias -g G='| grep'
alias -g L='| less'
alias -g H='| head'
alias -g W='| wc -l'
alias -g N='2>/dev/null'
# 使用
dmesg G usb # dmesg | grep usb
find / -name "*.log" N W # find ... 2>/dev/null | wc -l
Suffix Alias — 按扩展名自动选择程序
bash
alias -s py=vim # ./script.py 自动用 vim 打开
alias -s md=code # README.md 用 VS Code
alias -s pdf=zathura # .pdf 用 zathura
4. 通配符与限定符
Zsh 的通配符能力远超 Bash,无需 find 命令:
bash
ls **/*.java # 递归匹配所有 .java 文件
ls *(.) # 仅普通文件
ls *(/) # 仅目录
ls *(L+1m) # 大于 1MB 的文件
ls *(m-7) # 7 天内修改过的文件
ls *(om[1,5]) # 按修改时间排序取前 5 个
rm *(L0) # 删除空文件
ls ^*.bak # 不以 .bak 结尾的文件(需 setopt EXTENDED_GLOB)
5. 变量操作
无需 sed / awk,Zsh 原生支持丰富的字符串操作:
bash
name="hello_world.txt"
echo ${#name} # 15(长度)
echo ${name%.txt} # hello_world(删后缀)
echo ${name##*_} # world.txt(删最长前缀)
echo ${name//_/ - } # hello - world.txt(全局替换)
echo ${(U)name} # HELLO_WORLD.TXT(转大写)
echo ${(L)name} # hello_world.txt(转小写)
数组(从 1 开始!)
bash
arr=(apple banana cherry)
echo ${arr[1]} # apple(注意不是 0)
echo ${arr[-1]} # cherry
echo ${arr[2,3]} # banana cherry
echo ${^arr}.log # apple.log banana.log cherry.log
6. 插件推荐
| 插件 | 功能 | 安装 |
|---|---|---|
| zsh-autosuggestions | 历史自动提示(灰色建议) | zinit light zsh-users/zsh-autosuggestions |
| zsh-syntax-highlighting | 实时语法高亮(有效=绿/无效=红) | zinit light zsh-users/zsh-syntax-highlighting |
| fzf | 模糊搜索(Ctrl+T/R 文件/历史) | ~/.fzf/install |
| zoxide | 智能目录跳转(替代 z/cd) | cargo install zoxide |
7. 快捷键速查
| 快捷键 | 功能 |
|---|---|
Ctrl+A |
光标移到行首 |
Ctrl+E |
光标移到行尾 |
Ctrl+W |
删除光标前一个单词 |
Ctrl+U |
删除光标前全部内容 |
Ctrl+K |
删除光标后全部内容 |
Ctrl+Y |
粘贴最近删除的内容 |
Alt+. |
插入上一条命令的最后一个参数 |
Ctrl+R |
增量搜索历史 |
总结
Zsh 的核心优势在于补全系统和通配符。配置好 matcher-list + menu select + fzf,你的终端效率至少提升 50%。再加上 global alias 和变量操作,很多场景下你不再需要
find、sed、awk。
