Zsh 命令速查表 - Shell 终端配置常用命令大全
默认 shell 换成 zsh 之后,真正带来效率提升的不是命令语法,而是三件事:更聪明的补全、按前缀搜索的历史、把提示符变成信息面板。这张表按基础配置、变量与数组、通配与扩展、历史与搜索、函数与补全、提示符定制、oh-my-zsh 与插件七组组织,正对应 .zshrc 里会被反复改的部分。几个判断点写在表内:zsh 数组下标从 1 开始而 bash 从 0 开始,迁移老脚本时这条最容易出错;setopt AUTO_CD 允许直接输入目录名回车进入,配合 AUTO_PUSHD 把访问过的目录压栈,cd -<Tab> 就是跳转列表。历史一组的关键是 bindkey 后接 history-search-backward,把上下键从「翻时间」改成「按当前前缀搜」。oh-my-zsh 每次启动有开销,生产机器上只取需要的插件。
典型使用场景
面向把默认 shell 换成 zsh 的开发者:让补全、历史检索、别名与提示符真正替自己干活。zsh 相对 bash 多出来的价值集中在三处——递归通配(**)、可复制的历史搜索(Ctrl+R)、以及 glob 限定符(*(om[1]) 取最新文件)。本表覆盖 .zshrc 高频配置项与 oh-my-zsh 插件用法,适合刚换 shell 的一周内集中过一遍,之后按需回查。
基础配置 5
chsh -s $(which zsh)source ~/.zshrcecho $SHELLsetopt AUTO_CDsetopt CORRECT变量与数组 6
NAME="value"arr=(a b c)echo $arr[1]echo ${arr[@]}${#arr[@]}typeset -A dict\ndict[key]=value通配与扩展 6
**/*.js*.{js,ts}*(.)*(/)*(om[1])=ls历史与搜索 6
HISTSIZE=10000 / SAVEHIST=10000setopt SHARE_HISTORYCtrl+R!!!$history -i | tail函数与补全 4
function name() { ... }alias ll="ls -la"autoload -Uz compinit && compinitcompdef _git g=git提示符定制 5
PROMPT='%n@%m %~ %# '%n / %m / %M%~ / %dRPROMPT="%T"%T / %D / %Woh-my-zsh 与插件 5
plugins=(git zsh-autosuggestions zsh-syntax-highlighting)ZSH_THEME="robbyrussell"zsh-autosuggestionszsh-syntax-highlightingextract file.tar.gz参数矩阵
| 参数 | 作用 | 示例 |
|---|---|---|
setopt AUTO_CD | 输入目录名即进入,无需写 cd | setopt AUTO_CD |
setopt CORRECT | 命令拼错时提示纠正 | setopt CORRECT |
HISTSIZE / SAVEHIST | 内存与文件的历史条数,两者都设才生效 | HISTSIZE=10000; SAVEHIST=10000 |
setopt SHARE_HISTORY | 多终端实时共享历史记录 | setopt SHARE_HISTORY |
Ctrl+R | 反向增量搜索历史命令 | Ctrl+R 后输入 git 关键词 |
!! | 执行上一条命令,sudo !! 是经典组合 | sudo !! |
!$ | 上一条命令的最后一个参数 | mkdir -p /var/log/app; cd !$ |
**/*.js | 递归匹配所有层级的 .js 文件 | ls **/*.js |
*.{js,ts} | 花括号扩展,一次匹配多种后缀 | ls *.{js,ts} |
*(om[1]) | glob 限定符:取最近修改的一个文件 | ls -t *(om[1]) |
compdef _git g | 为别名 g 复用 git 的补全 | compdef _git g=git |
%~ / %n / %T | 提示符占位符:当前目录 / 用户名 / 时间 | PROMPT='%n@%m %~ %# ' |
易错点与避坑指南
现象脚本从 bash 换到 zsh 后数组取值全为空,${arr[0]} 拿不到第一个元素。
原因zsh 数组默认从下标 1 开始,而 bash 从 0 开始。
处置改用 ${arr[1]},或执行 emulate sh / setopt KSH_ARRAYS 让行为贴近 bash。
现象在 .zshrc 里定义了 alias 后,同一行继续用该别名没有生效。
原因alias 在同一次读取中只对其后的命令生效。
处置把 alias 单独放一行,或改用函数 function name() { ... }。
现象装上 zsh-syntax-highlighting 后命令高亮不工作或报错。
原因插件加载顺序不对,highlighter 必须在 plugins 数组最后加载。
处置写 plugins=(git zsh-autosuggestions zsh-syntax-highlighting),把 highlighter 放到末尾。
现象切到 zsh 后进不去交互 shell,只能走 sh 兜底。
原因~/.zshrc 存在语法错误,启动时解析中断。
处置用 zsh -n ~/.zshrc 做语法检查(只解析不执行),定位到错误行先注释掉。
现象zsh-autosuggestions 的灰色建议按方向键不接受。
原因默认接受键是 →(右方向键),按 End 或空格无效。
处置按 → 接受整条建议;只接受单词需额外配置。
现象Ctrl+R 搜到的命令执行后发现参数不对,但历史里只有这一条。
原因历史中未保存该命令的变体。
处置提高历史条数:HISTSIZE=10000 SAVEHIST=10000,并用 history -i | tail 看带时间戳的历史。
排障路径
1确认当前 shell 与配置是否生效
echo $SHELL && zsh -n ~/.zshrc前者看登录 shell,后者只做语法检查(-n),能定位 .zshrc 的解析错误。
2改完配置立即重载
source ~/.zshrc每次改 .zshrc 后执行一次;可写成 alias reload-cfg="source ~/.zshrc" 省事。
3递归查找任意层级的 .js 文件
ls **/*.js** 是 zsh 的递归通配;bash 需先开启 globstar(shopt -s globstar)。
4取出最近修改的那个日志文件
ls -t *(om[1])(om[1]) 是 glob 限定符,o 按修改时间排序取第 1 个;bash 需 find + printf。
5在历史里搜含关键字的命令并直接执行
git rebase输入前缀后按 Ctrl+R 向上检索,回车执行;配 SHARE_HISTORY 多终端实时共享。
命令示例
交互式取历史里最近的匹配命令
git rebase直接在终端输入 git rebase 再按 Ctrl+R,会向上检索含该前缀的历史,方向键或 Enter 直接执行。配 setopt SHARE_HISTORY 多终端历史实时共享。
复用上一条命令的最后一个参数
mkdir -p /var/log/myapp
cd !$!$ 展开为上一条命令的最后一个参数,!^ 是第一个,!! 是整条。sudo !! 是最经典的组合——先执行一条危险命令,再用同样的参数加 sudo 重跑。
递归匹配任意层级的文件
ls **/*.ts
ls *(om[1]).log** 递归匹配所有层级(bash 需开启 globstar);*(om[1]) 是 glob 限定符,取最近修改的一个 .log 文件。bash 要用 find 配合 -printf 才能做到。
输出
src/index.ts src/api/client.ts src/api/auth/login.ts
改完 .zshrc 立即生效
source ~/.zshrc每次改动后执行一次;写成 alias reload-cfg="source ~/.zshrc" 更方便。注意 alias 在同一个文件里定义后不会作用于该行本身。
常见坑与注意事项
- zsh 数组从 1 开始,${arr[0]} 是空元素,跨 shell 脚本里最容易踩。
- alias 定义在同一行之后才对后续命令生效,把 alias 和用法写在同一行不起作用。
- 插件顺序有要求,zsh-syntax-highlighting 必须放在 plugins 数组最后加载。
- ${#arr[@]} 在 zsh 与 bash 下行为一致,但 ${arr[@]} 的展开方式不同,跨 shell 脚本需显式加引号。
- 直接替换系统 shell 前先验证 ~/.zshrc 无语法错误;一个语法错误会让你进不去交互 shell。
提示
- oh-my-zsh 安装:sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
- zsh-autosuggestions 需要单独安装插件,推荐用 git clone 到 $ZSH_CUSTOM/plugins/。
- setopt AUTO_CD 可以直接输入目录名 cd 进去,不用写 cd 命令。
- 让上下箭头按前缀搜索历史:bindkey 加 history-search-backward/forward。
- zsh 数组下标从 1 开始(与 bash 从 0 开始不同),迁移脚本时要注意。
- ZDOTDIR 环境变量可改变 zsh 配置文件目录,便于多套配置隔离。
- autoload -Uz compinit && compinit 能打开 zsh 自带的补全框架,很多 oh-my-zsh 插件实际依赖它先完成初始化。
- setopt HIST_IGNORE_DUPS 在写入时就丢弃连续重复项,比事后用 HIST_IGNORE_ALL_DUPS 清理更省内存且历史文件更小。
- 在 .zshrc 末尾加 echo $? 之类的方式调试配置报错时,可用 typeset -p 打印变量是否展开成功,比逐步 echo 更快定位。
常见问题
zsh 数组的下标从几开始?
zsh 默认数组从 1 开始,而 bash 是从 0 开始。这个差异是跨 shell 脚本最常见的坑之一:在 zsh 里 ${arr[0]} 引用的是空元素而非第一个元素,正确的写法是 ${arr[1]}。想让 zsh 表现得像 bash,可执行 emulate sh 或 setopt KSH_ARRAYS。
Ctrl+R 之外,zsh 还有哪些好用的历史搜索方式?
Ctrl+R 是反向增量搜索,重复按可继续往前翻。除此之外还有几个实用技巧:!! 复用上一条命令,sudo !! 是最经典的组合;!$ 取上一条命令的最后一个参数,比如 mkdir -p /var/log/app 后 cd !$ 就直接进目录;!^ 取第一个参数。setopt SHARE_HISTORY 还能让多个终端窗口实时共享历史记录。
zsh 的通配符比 bash 强在哪?
主要有三点。一是 ** 递归匹配子目录,bash 需要开启 globstar 才能做到;二是花括号扩展 *.{js,ts} 一次匹配多种后缀,不用写多个模式;三是 glob 限定符,例如 *(.) 只匹配普通文件、*(/) 只匹配目录、*(om[1]) 取最新修改的那一个。bash 里要用 find 才能实现类似筛选。
怎么给 zsh 配置语法高亮和自动建议?
装两个插件即可:zsh-syntax-highlighting 让命令语法实时高亮(命令拼错显示为红色),zsh-autosuggestions 根据历史给出灰色建议,按 → 键接受。在 .zshrc 里写 plugins=(git zsh-autosuggestions zsh-syntax-highlighting) 并启用 compinit 补全系统。注意 highlighter 必须放在 plugins 数组的最后加载。
zsh 的提示符里 %~ %n %T 分别代表什么?
%n 是用户名,%m 是短主机名,%M 是完整主机名;%~ 是当前路径并把主目录缩写为 ~,%d 则是完整绝对路径;%T 是 24 小时制时间,%D 是年月日,%W 是月日年。典型配置 PROMPT='%n@%m %~ %# ' 显示「用户名@主机 路径」再加一个提示符,%# 在普通用户显示 $、root 显示 #。
由 巧匠 维护
公开更新于 2026年7月21日,内容持续校对官方文档。