fish + starship
官网
如果之前一直用的是 zsh + oh-my-zsh,现在准备切到 fish + starship,这篇可以直接当迁移清单来用。
简单说,这套组合里:
fish负责交互体验、补全、历史提示、函数与 alias 管理starship负责统一 prompt 外观oh-my-zsh以前管的一部分主题、补全和提示,会拆给fish和starship
为什么从 zsh + oh-my-zsh 切到 fish + starship
通常会因为这几件事想切:
- 不想再维护一长串
~/.zshrc里的插件和主题脚本 - 想要开箱即用的自动补全和历史建议
- 想把 prompt 外观和 shell 本身拆开,后面再换 shell 也不用重做提示符
- 想要更清晰的配置目录结构,例如
~/.config/fish/config.fish、~/.config/starship.toml
切换前先确认
切之前先过一眼自己到底在依赖什么,不然很容易换完才发现常用命令没了:
~/.zshrc里是否有自定义alias- 是否配置了
PATH - 是否有
nvm、pnpm、rbenv、pyenv、conda之类环境初始化脚本 - 是否依赖
oh-my-zsh插件,例如git、z、zsh-autosuggestions、zsh-syntax-highlighting - 是否使用了主题相关配置,例如
powerlevel10k
第一步:备份现有配置
先备份,再动手。至少把下面这些文件留一份:
mkdir -p ~/shell-backup
cp ~/.zshrc ~/shell-backup/.zshrc.bak 2>/dev/null
cp ~/.zprofile ~/shell-backup/.zprofile.bak 2>/dev/null
cp ~/.p10k.zsh ~/shell-backup/.p10k.zsh.bak 2>/dev/null
cp -R ~/.oh-my-zsh ~/shell-backup/.oh-my-zsh.bak 2>/dev/null
如果还改过 iTerm2、Warp 或者 Terminal.app 的字体和配色,也顺手记一下,后面排查乱码会省很多事。
第二步:安装 Homebrew
如果本机还没装 Homebrew,就先装这个。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
装完以后,按 Homebrew 的提示把 brew shellenv 写进当前 shell 配置文件。
Homebrew 官方默认路径通常是:
- Apple Silicon:
/opt/homebrew - Intel Mac:
/usr/local
第三步:安装 fish 和 starship
最省事的方式就是直接走 Homebrew:
brew install fish
brew install starship
装完先看一眼版本和路径:
fish --version
starship --version
which fish
which starship
第四步:准备终端字体
starship 里的不少图标依赖 Nerd Font。没装也能用,就是大概率会乱码。
常见选择:
FiraCode Nerd FontJetBrainsMono Nerd FontHack Nerd Font
字体装好以后,记得在终端里手动切过去。例如:
- iTerm2:
Profiles -> Text -> Font - macOS Terminal:
设置 -> 描述文件 -> 文本 -> 字体 - Warp:
Settings -> Appearance -> Font
第五步:先临时进入 fish
先别急着改默认 shell,临时进一次 fish 看看:
fish
退出时执行:
exit
重点看这几件事是不是正常:
- 命令能执行
brew可用- 中文显示没问题
- 字体图标没有明显乱码
第六步:把 starship 接到 fish
fish 的主配置文件是:
~/.config/fish/config.fish
如果文件还没有,就先创建:
mkdir -p ~/.config/fish
touch ~/.config/fish/config.fish
然后在 config.fish 末尾加上:
starship init fish | source
想立刻生效的话,重新开一个 fish 会话,或者直接执行:
source ~/.config/fish/config.fish
第七步:把 zsh 配置迁移到 fish
这一步最花时间。
fish 不是 POSIX shell,很多 zsh/bash 写法不能直接照抄。最稳的做法不是整段复制 ~/.zshrc,而是按功能一块块迁。
1. 迁移环境变量
zsh 里常见写法:
export EDITOR=vim
export PATH="$HOME/bin:$PATH"
对应的 fish 写法:
set -gx EDITOR vim
fish_add_path ~/bin
这里有两个区别:
set -gx用来设置全局环境变量并导出fish_add_path比手工拼PATH更顺手
2. 迁移 alias
zsh 写法:
alias gs="git status"
alias ll="ls -la"
fish 写法:
alias gs="git status"
alias ll="ls -la"
这一类最省心,简单 alias 基本可以直接拿过来。
3. 迁移函数
zsh 写法:
mkcd () {
mkdir -p "$1" && cd "$1"
}
fish 写法:
function mkcd
mkdir -p $argv[1]
cd $argv[1]
end
如果函数不少,建议拆到:
~/.config/fish/functions/
例如:
~/.config/fish/functions/mkcd.fish
后面找和改都会轻松很多。
4. 迁移 Node / Python / Ruby 等环境初始化
这里最容易踩坑,因为很多官方安装脚本默认都是给 bash/zsh 写的。
常见做法如下:
pnpm
如果之前是安装脚本自动写进 ~/.zshrc 的,迁过来以后就得把那段初始化逻辑改成 fish 版本。
可以先执行:
pnpm setup
然后看它给出的 fish 配置提示照着改。
nvm
nvm 原生还是更偏 bash/zsh。如果平时很依赖它,可以考虑:
- 继续保留
zsh专门跑nvm - 改用
fnm - 改用
mise
如果只是日常切 Node 版本,fnm 在 fish 下通常更省心。
pyenv / rbenv
这类工具一般都支持输出各自 shell 的初始化脚本。迁移时最好直接看官方文档,不要把 .zshrc 里的旧代码硬搬过来。
5. 替代 oh-my-zsh 的常用能力
从 oh-my-zsh 迁过来,可以这么理解:
gitalias: 自己保留常用 alias,或者按需定义函数- 自动补全:
fish自带的已 经很好用了,通常不需要再补一层插件 - 历史建议:
fish默认内置 - 语法高亮:
fish自带的交互反馈已经够用了 - 目录跳转: 可以继续配合
zoxide
如果之前很依赖 z,那就直接装 zoxide:
brew install zoxide
然后在 ~/.config/fish/config.fish 里加上:
zoxide init fish | source
这样之后还是可以继续用 z foo 这种方式跳目录。
第八步:按需自定义 starship
starship 的配置文件默认在:
~/.config/starship.toml
如果还没有这个文件,先从一个最小配置开始就够了:
add_newline = false
[character]
success_symbol = "[➜](bold green)"
error_symbol = "[➜](bold red)"
如果想让 prompt 再干净一点,也可以逐步关掉一些模块,比如:
[nodejs]
disabled = true
[package]
disabled = true
我的建议是先跑起来,再慢慢裁。别一开始就把配置堆复杂。
第九步:把 fish 设为默认 shell
确认临时体验没问题以后,再切默认 shell。
先确认 fish 实际安装路径:
which fish
Homebrew 安装在 Apple Silicon Mac 上,通常会得到:
/opt/homebrew/bin/fish
如果 fish 还没出现在 /etc/shells 里,就先加进去:
echo $(which fish) | sudo tee -a /etc/shells
然后切换默认 shell:
chsh -s $(which fish)
执行完以后,通常需要:
- 关闭当前终端窗口
- 重新打开终端
- 或者注销后重新登录系统
第十步:验证切换是否成功
重新打开终端以后,建议逐项检查:
echo $SHELL
echo $STARSHIP_SHELL
which fish
which starship
然后再手动确认下面这些行为:
- 打开终端后默认进入
fish - prompt 已经变成
starship - 常用命令别名可用
git、node、pnpm、python等命令都能正常执行PATH里的工具链没有丢
常见问题
1. fish 下以前的 zsh 脚本报错
这很正常,因为 fish 语法本来就和 zsh/bash 不兼容。
如果临时需要执行一段 bash 命令,可以这样跑:
bash -lc '待执行的命令'
2. starship 图标乱码
大多数时候就是终端字体没有切到 Nerd Font。
优先检查:
- 字体是否真的安装成功
- 当前终端 profile 是否切到了新字体
- 是否有多个终端窗口仍在用旧 profile
3. brew 在新 shell 里不可用
一般都是因为 Homebrew 的环境变量没有正确写进初始化配置。
先检查:
which brew
如果找不到,再按 Homebrew 官方安装完成后给出的 shellenv 提示补配置。
4. 以前 oh-my-zsh 的插件功能没有了
这是迁移里最常见的落差感。
这里要稍微换个思路:
- 能被
fish原生接管的,就别再补同类插件 - 能被
starship接管的 prompt 能力,就别继续堆主题框架 - 少量确实高频的能力,再单独补工具,例如
zoxide
回滚方案
如果切过去以后一时不适应,随时都能回到 zsh。
临时切回
当前终端里直接执行:
zsh
永久切回
把默认 shell 改回 zsh:
chsh -s /bin/zsh
如果已经改了不少 fish 配置,也可以先留着,等完全稳定以后再决定要不要清理:
~/.config/fish/~/.config/starship.toml
一份可直接参考的 config.fish
下面放一份比较适合从 zsh + oh-my-zsh 迁过来的最小示例:
if status is-interactive
starship init fish | source
end
fish_add_path ~/bin
set -gx EDITOR vim
alias gs="git status"
alias ga="git add"
alias gc="git commit"
alias gp="git push"
alias ll="ls -la"
alias ..="cd .."
zoxide init fish | source
一份建议的迁移顺序
如果不想一次改太多,按这个顺序走会比较稳:
- 备份
zsh配置 - 安装
fish - 安装
starship - 临时进入
fish - 接入
starship - 迁移
PATH、环境变量和 alias - 补回必须的开发环境初始化
- 验证没问题后再改默认 shell
参考资料
以下命令和步骤已按 2026 年 4 月 27 日的官方文档核对过: