Skip to content

fish Shell 使用 ​

官方网址:https://fishshell.com/

fish 与 Bash ​

在 WSL 中开发时,我们经常要重复输入项目路径和用过的命令。本节先用 fish 缩短这些输入,再配置一个“创建目录并进入目录”的常用命令。

fish 是一个面向交互使用的 Shell,安装后就有语法高亮、命令建议、Tab 补全和历史搜索。它运行在上一节配置的 WezTerm 与 WSL Ubuntu 中,负责解释输入的命令。

两者都是 Shell,区别主要在默认交互体验和脚本语法:

对比项Bashfish
默认程度Linux/WSL 常见默认 shell需要额外安装
交互体验较传统更友好
自动补全可配置但偏传统默认体验较好
脚本兼容性通用性强语法与 Bash 不完全兼容
适合场景系统脚本、服务器环境日常交互、开发命令行

fish 是运行在 Ubuntu 中的 Shell;WezTerm 仍负责显示终端窗口。

安装与启动 ​

安装 fish ​

bash
sudo apt update
sudo apt install fish
fish --version
  • apt update:更新软件列表
  • apt install fish:安装 fish
  • sudo:以管理员权限执行

这些命令在 WSL Ubuntu 中运行,不要在 Windows PowerShell 中执行。fish --version 能输出版本号,即表示安装完成。

启动与退出 ​

bash
fish

提示符变化后,就可以体验 fish 的交互功能。如果上一节使用 WezTerm 的新标签页,默认仍会进入 WSL 的登录 Shell;本节先手动输入 fish。

结束当前 fish 会话时输入:

fish
exit

从 Bash 手动进入 fish 后,exit 会结束这一层 fish,返回原来的 Bash。直接输入 bash 会再启动一层 Shell,不是退出 fish。完成下面的功能练习前,再输入一次 fish。

Shell 会话进程嵌套机制与默认 Shell 变更时序图

交互功能 ​

自动建议

先在 fish 中执行一次进入练习目录的命令,再回到主目录:

fish
mkdir -p ~/fish-demo
cd ~/fish-demo
cd ~

现在只输入 cd ~/fi,先不要按回车。fish 会根据历史命令或现有路径,在光标后显示灰色建议;按 → 接受建议,再按回车执行。按 Alt + → 可以只接受建议中的下一个词。建议没有出现时,先确认上面的 cd ~/fish-demo 已执行过。

Tab 补全

先执行 cd ~ 回到主目录,再输入 cd ~/fi,然后按 Tab。如果只有一个匹配项,fish 会补全为 cd ~/fish-demo;有多个匹配项时,会列出候选项供你选择。<Tab> 表示按键动作,不需要把这几个字符输入终端。

Tab 补全还可用于:

  • 补全目录
  • 补全命令
  • 补全部分参数

语法高亮

在 fish 提示符中分别输入 ls 和一个不存在的命令,例如 no-such-command,先不要按回车。观察输入颜色的变化。颜色取决于当前主题,重点是 fish 会在执行前提示命令或路径是否可识别。

常见现象包括:

  • 命令存在:通常显示为正常颜色
  • 命令不存在:可能显示为错误颜色
  • 路径存在:可被识别
  • 路径不存在:会提示异常

历史搜索

输入 cd 后按 ↑,fish 会优先找包含 cd 的历史命令;按 ↓ 可向较新的记录移动。输入行留空时,↑ / ↓ 会浏览更广的历史记录。自动建议侧重“继续输入当前命令”,历史搜索侧重“找回已执行过的命令”。

fish Shell 四大开箱即用核心交互特性全景图

常用命令与配置 ​

日常使用时,先掌握与 Bash 相同的命令,再了解少量会影响复制示例的语法差异。

常用命令

常见命令可以照常使用,例如:

fish
pwd
ls
mkdir -p demo
cd demo

其中既有 cd 这样的 Shell 内置命令,也有 ls、mkdir 等外部程序;使用 fish 不需要重新学习这些日常操作。

PATH 与别名写法

例如 Bash 中常这样修改 PATH:

bash
export PATH="$PATH:$HOME/.local/bin"

fish 中的 PATH 是路径列表,可以写成:

fish
set -gx PATH $PATH $HOME/.local/bin

实际添加目录时,下文会用 fish_add_path 避免重复添加。

Bash 里的别名:

bash
alias ll='ls -al'

fish 中也可以写:

fish
alias ll='ls -al'

fish 的 alias 是创建简单函数的便捷写法;遇到“先创建目录、再进入目录”这样的多步操作,直接写 function 更清楚。

创建并加载配置文件 ​

text
~/.config/fish/config.fish

如果目录不存在,可以创建:

bash
mkdir -p ~/.config/fish
touch ~/.config/fish/config.fish

使用 nano ~/.config/fish/config.fish 打开文件。下面的别名、变量和函数示例可以逐项写入;保存后在 fish 中执行 source ~/.config/fish/config.fish,让当前会话立即使用新配置。也可以退出 fish 后重新进入。

这里适合放:

  • 常用环境变量
  • PATH 配置
  • alias
  • function
  • Starship 初始化(下一节)
  • 常用工具初始化代码

常用别名

fish
alias ll='ls -al'
alias la='ls -A'
alias ..='cd ..'

保存并重新加载配置后,输入 ll,应看到当前目录的详细文件列表。

环境变量

fish
set -gx EDITOR vim

-g 表示全局作用域,-x 表示导出给后续启动的程序。输入 echo $EDITOR,应看到 vim;如果未安装 vim,可把值换成自己已安装的编辑器。

PATH 配置与验证 ​

例如添加用户自己的 bin 目录,先创建目录,再在 fish 中执行:

fish
mkdir -p ~/.local/bin
fish_add_path ~/.local/bin

输入 contains -- $HOME/.local/bin $PATH; echo $status,输出 0 表示该目录已在 PATH 中。fish_add_path 默认会保留设置,重复执行也不会反复追加同一路径;如果想把设置写在 config.fish 中,同样可以使用这一行。

mkcd 函数 ​

把这个函数写入 config.fish。它接收一个目录名,先创建目录,再进入目录:

fish
function mkcd
    if test (count $argv) -ne 1
        echo "用法:mkcd 目录名"
        return 1
    end

    mkdir -p $argv[1]
    or return 1
    cd $argv[1]
end

保存并重新加载配置后,在 ~/fish-demo 中运行:

fish
cd ~/fish-demo
mkcd demo
pwd

pwd 应显示以 /fish-demo/demo 结尾的路径。这个函数完成的操作相当于:

fish
mkdir -p demo
cd demo

不传目录名时会显示用法;创建目录失败时不会继续执行 cd。这也是多步操作更适合用 function 的原因。

fish 配置文件 config.fish 架构全景与变量加载

后续工具

Starship 是跨 Shell 的提示符工具,可以显示 Git 分支、语言版本和目录状态,支持 fish、Bash、zsh 等 Shell。需要更丰富的提示符时,可以在下一节安装和配置。

Fisher 是 fish 的插件管理工具,用于安装插件、主题和补全增强。本节的功能都不依赖插件。先用熟 fish 自带功能,需要额外插件时再考虑 Fisher。

默认 Shell 设置 ​

设置时机

默认 Shell 是用户登录时启动的 Shell。本系列的 WezTerm 通过 wsl.exe 进入 Ubuntu;如果还未修改默认 Shell,每次新建标签页可以手动输入 fish。

初学阶段可以保留 Bash,每次手动输入 fish。这样既方便对照使用 Bash 的教程,也方便发现两种 Shell 的语法差异。熟悉 fish 后,再决定是否修改默认 Shell。

设置与恢复 ​

确认已经能安装、启动和退出 fish 后,在 Bash 中查看它的路径:

bash
command -v fish

查看 fish 路径,例如:

text
/usr/bin/fish

先检查这个路径是否在 /etc/shells 中:

bash
grep -Fx "$(command -v fish)" /etc/shells

如果输出了 fish 的路径,再修改当前用户的登录 Shell:

bash
chsh -s "$(command -v fish)"

按提示输入 WSL 用户密码,然后关闭并重新打开 WSL 标签页,确认启动后出现 fish 提示符。如果路径不在 /etc/shells 中,先按 fish 官方设置说明核对安装路径和允许的 Shell 列表。

如果之后想切回 Bash:

bash
chsh -s /bin/bash

切回 Bash 后重新打开 WSL 标签页才会生效。若教程中的命令在 fish 中报语法错误,可先按下文的方法交给 Bash 执行。

Bash 语法与脚本兼容 ​

复制 Bash 教程中的命令时,先检查变量赋值、配置文件和脚本解释器;这些地方比 ls、git 等普通命令更容易出现差异。

变量设置

Bash:

bash
export NAME=zhengxin

fish:

fish
set -gx NAME zhengxin

fish 也提供 export NAME=VALUE 的兼容用法;本节使用 set -gx,便于看清变量作用域和导出行为。

普通变量同样用 set 赋值,读取时仍使用 $变量名:

Bash:

bash
name=zhengxin
echo $name

fish:

fish
set name zhengxin
echo $name

命令替换

Bash 常见写法:

bash
echo $(pwd)

fish 当前同时支持 $(pwd) 和 (pwd),下面展示后者,便于识别 fish 示例:

fish
echo (pwd)

脚本解释器 ​

脚本由运行它的解释器解析,文件扩展名不能单独决定语法:

  • Bash 脚本可使用 bash script.sh 明确指定解释器。
  • 可执行脚本若写有 #!/bin/bash 或 #!/usr/bin/env bash,用 ./script.sh 运行时会按首行选择解释器。
  • 不要用 fish script.sh 去解释 Bash 脚本,也不要把 .bashrc 中的内容直接复制进 config.fish。

fish 适合日常交互和编写自己的函数;需要编写通用 Shell 脚本时,按运行环境选择 Bash/sh;复杂自动化任务还可使用 Python、Justfile 或 Makefile。

常见问题 ​

Bash 转 fish 语法差异与四大高危陷阱红绿对照图

加载 .bashrc 后出现错误 ​

fish 启动时不会自动读取 Bash 的 .bashrc。手动在 fish 中执行 source ~/.bashrc,也会尝试按 fish 语法解析 Bash 配置,可能报错或出现不符合预期的行为。fish 自己的配置文件是:

text
~/.config/fish/config.fish

需要迁移某项设置时,按 fish 语法把那一项写入 config.fish,不要直接加载整份 .bashrc。

注意

Python 虚拟环境在 fish 中应使用 source .venv/bin/activate.fish,不要加载面向 Bash 的 activate 文件。

Bash 安装脚本的执行 ​

如果教程要求在 Bash 中逐行输入命令,可以临时进入 Bash:

fish
bash

执行完成后输入 exit,返回原来的 fish。对于已有 Bash 脚本,直接运行 bash script.sh;带有正确解释器首行的可执行脚本也可按其说明运行。