fish Shell 使用
fish 与 Bash
在 WSL 中开发时,我们经常要重复输入项目路径和用过的命令。本节先用 fish 缩短这些输入,再配置一个“创建目录并进入目录”的常用命令。
fish 是一个面向交互使用的 Shell,安装后就有语法高亮、命令建议、Tab 补全和历史搜索。它运行在上一节配置的 WezTerm 与 WSL Ubuntu 中,负责解释输入的命令。
两者都是 Shell,区别主要在默认交互体验和脚本语法:
| 对比项 | Bash | fish |
|---|---|---|
| 默认程度 | Linux/WSL 常见默认 shell | 需要额外安装 |
| 交互体验 | 较传统 | 更友好 |
| 自动补全 | 可配置但偏传统 | 默认体验较好 |
| 脚本兼容性 | 通用性强 | 语法与 Bash 不完全兼容 |
| 适合场景 | 系统脚本、服务器环境 | 日常交互、开发命令行 |
fish 是运行在 Ubuntu 中的 Shell;WezTerm 仍负责显示终端窗口。
安装与启动
安装 fish
sudo apt update
sudo apt install fish
fish --versionapt update:更新软件列表apt install fish:安装 fishsudo:以管理员权限执行
这些命令在 WSL Ubuntu 中运行,不要在 Windows PowerShell 中执行。fish --version 能输出版本号,即表示安装完成。
启动与退出
fish提示符变化后,就可以体验 fish 的交互功能。如果上一节使用 WezTerm 的新标签页,默认仍会进入 WSL 的登录 Shell;本节先手动输入 fish。
结束当前 fish 会话时输入:
exit从 Bash 手动进入 fish 后,exit 会结束这一层 fish,返回原来的 Bash。直接输入 bash 会再启动一层 Shell,不是退出 fish。完成下面的功能练习前,再输入一次 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 的历史命令;按 ↓ 可向较新的记录移动。输入行留空时,↑ / ↓ 会浏览更广的历史记录。自动建议侧重“继续输入当前命令”,历史搜索侧重“找回已执行过的命令”。
常用命令与配置
日常使用时,先掌握与 Bash 相同的命令,再了解少量会影响复制示例的语法差异。
常用命令
常见命令可以照常使用,例如:
pwd
ls
mkdir -p demo
cd demo其中既有 cd 这样的 Shell 内置命令,也有 ls、mkdir 等外部程序;使用 fish 不需要重新学习这些日常操作。
PATH 与别名写法
例如 Bash 中常这样修改 PATH:
export PATH="$PATH:$HOME/.local/bin"fish 中的 PATH 是路径列表,可以写成:
set -gx PATH $PATH $HOME/.local/bin实际添加目录时,下文会用 fish_add_path 避免重复添加。
Bash 里的别名:
alias ll='ls -al'fish 中也可以写:
alias ll='ls -al'fish 的 alias 是创建简单函数的便捷写法;遇到“先创建目录、再进入目录”这样的多步操作,直接写 function 更清楚。
创建并加载配置文件
~/.config/fish/config.fish如果目录不存在,可以创建:
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 初始化(下一节)
- 常用工具初始化代码
常用别名
alias ll='ls -al'
alias la='ls -A'
alias ..='cd ..'保存并重新加载配置后,输入 ll,应看到当前目录的详细文件列表。
环境变量
set -gx EDITOR vim-g 表示全局作用域,-x 表示导出给后续启动的程序。输入 echo $EDITOR,应看到 vim;如果未安装 vim,可把值换成自己已安装的编辑器。
PATH 配置与验证
例如添加用户自己的 bin 目录,先创建目录,再在 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。它接收一个目录名,先创建目录,再进入目录:
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 中运行:
cd ~/fish-demo
mkcd demo
pwdpwd 应显示以 /fish-demo/demo 结尾的路径。这个函数完成的操作相当于:
mkdir -p demo
cd demo不传目录名时会显示用法;创建目录失败时不会继续执行 cd。这也是多步操作更适合用 function 的原因。
后续工具
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 中查看它的路径:
command -v fish查看 fish 路径,例如:
/usr/bin/fish先检查这个路径是否在 /etc/shells 中:
grep -Fx "$(command -v fish)" /etc/shells如果输出了 fish 的路径,再修改当前用户的登录 Shell:
chsh -s "$(command -v fish)"按提示输入 WSL 用户密码,然后关闭并重新打开 WSL 标签页,确认启动后出现 fish 提示符。如果路径不在 /etc/shells 中,先按 fish 官方设置说明核对安装路径和允许的 Shell 列表。
如果之后想切回 Bash:
chsh -s /bin/bash切回 Bash 后重新打开 WSL 标签页才会生效。若教程中的命令在 fish 中报语法错误,可先按下文的方法交给 Bash 执行。
Bash 语法与脚本兼容
复制 Bash 教程中的命令时,先检查变量赋值、配置文件和脚本解释器;这些地方比 ls、git 等普通命令更容易出现差异。
变量设置
Bash:
export NAME=zhengxinfish:
set -gx NAME zhengxinfish 也提供 export NAME=VALUE 的兼容用法;本节使用 set -gx,便于看清变量作用域和导出行为。
普通变量同样用 set 赋值,读取时仍使用 $变量名:
Bash:
name=zhengxin
echo $namefish:
set name zhengxin
echo $name命令替换
Bash 常见写法:
echo $(pwd)fish 当前同时支持 $(pwd) 和 (pwd),下面展示后者,便于识别 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。
常见问题
加载 .bashrc 后出现错误
fish 启动时不会自动读取 Bash 的 .bashrc。手动在 fish 中执行 source ~/.bashrc,也会尝试按 fish 语法解析 Bash 配置,可能报错或出现不符合预期的行为。fish 自己的配置文件是:
~/.config/fish/config.fish需要迁移某项设置时,按 fish 语法把那一项写入 config.fish,不要直接加载整份 .bashrc。
注意
Python 虚拟环境在 fish 中应使用 source .venv/bin/activate.fish,不要加载面向 Bash 的 activate 文件。
Bash 安装脚本的执行
如果教程要求在 Bash 中逐行输入命令,可以临时进入 Bash:
bash执行完成后输入 exit,返回原来的 fish。对于已有 Bash 脚本,直接运行 bash script.sh;带有正确解释器首行的可执行脚本也可按其说明运行。