跳到主要内容

fish + starship

官网

如果你之前一直用的是 zsh + oh-my-zsh,现在想切到 fish + starship,这篇可以直接当迁移清单来用。

简单说,这套组合里:

  • fish 负责交互体验、补全、历史提示、函数与 alias 管理
  • starship 负责统一 prompt 外观
  • oh-my-zsh 以前管的一部分主题、补全和提示,会拆给 fishstarship

为什么从 zsh + oh-my-zsh 切到 fish + starship

我自己觉得,大家通常是因为这几件事才会想切:

  • 不想再维护一长串 ~/.zshrc 里的插件和主题脚本
  • 想要开箱即用的自动补全和历史建议
  • 想把 prompt 外观和 shell 本身拆开,后面再换 shell 也不用重做提示符
  • 想要更清晰的配置目录结构,例如 ~/.config/fish/config.fish~/.config/starship.toml

切换前先确认

切之前先过一眼自己到底在依赖什么,不然很容易换完才发现常用命令没了:

  • ~/.zshrc 里是否有自定义 alias
  • 是否配置了 PATH
  • 是否有 nvmpnpmrbenvpyenvconda 之类环境初始化脚本
  • 是否依赖 oh-my-zsh 插件,例如 gitzzsh-autosuggestionszsh-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

第三步:安装 fishstarship

最省事的方式就是直接走 Homebrew:

brew install fish
brew install starship

装完先看一眼版本和路径:

fish --version
starship --version
which fish
which starship

第四步:准备终端字体

starship 里的不少图标依赖 Nerd Font。没装也能用,就是大概率会乱码。

常见选择:

  • FiraCode Nerd Font
  • JetBrainsMono Nerd Font
  • Hack 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 版本,fnmfish 下通常更省心。

pyenv / rbenv

这类工具一般都支持输出各自 shell 的初始化脚本。迁移时最好直接看官方文档,不要把 .zshrc 里的旧代码硬搬过来。

5. 替代 oh-my-zsh 的常用能力

oh-my-zsh 迁过来,可以这么理解:

  • git alias: 自己保留常用 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
  • 常用命令别名可用
  • gitnodepnpmpython 等命令都能正常执行
  • 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

一份建议的迁移顺序

如果你不想一次改太多,按这个顺序走会比较稳:

  1. 备份 zsh 配置
  2. 安装 fish
  3. 安装 starship
  4. 临时进入 fish
  5. 接入 starship
  6. 迁移 PATH、环境变量和 alias
  7. 补回必须的开发环境初始化
  8. 验证没问题后再改默认 shell

参考资料

以下命令和步骤已按 2026 年 4 月 27 日的官方文档核对过: