fish
为什么要使用 fish?
fish 是一个用户友好的命令行 shell,内置语法高亮、自动建议、Tab 补全等功能,很多功能不需要额外配置即可使用。
相比 fish 而言还有一个更出名的 zsh 与 on-my-zsh,但是配置太麻烦了,这里推荐 fish 开箱即用
- Bash 是默认且通用的 shell,虽然能用但是不够好用。
- fish 更偏向“开箱即用”和交互体验
- fish 适合日常命令行使用,不一定适合替代所有脚本场景
Bash 与 fish 的关系
建议用对比方式讲:
| 对比项 | Bash | fish |
|---|---|---|
| 默认程度 | Linux/WSL 常见默认 shell | 需要额外安装 |
| 交互体验 | 较传统 | 更友好 |
| 自动补全 | 可配置但偏传统 | 默认体验较好 |
| 脚本兼容性 | 通用性强 | 语法与 Bash 不完全兼容 |
| 适合场景 | 系统脚本、服务器环境 | 日常交互、开发命令行 |
重点:fish 不是 Ubuntu,也不是 WSL,而是替代 Bash 使用的一种 shell。
安装
使用 apt 安装 fish
sudo apt update
sudo apt upgrade
sudo apt install fishapt update:更新软件列表apt upgrade:升级已安装软件sudo:以管理员权限执行
启动 fish
fish退出 fish,回到 Bash
exit
# or
bashfish 官方文档也把安装、启动、退出、设置默认 shell 放在 Setup 部分,适合作为这一章的主线。
fish 比 Bash 方便在哪里
命令自动建议
举例:
cd /mnt/当你输入类似历史命令的前半部分时,fish 会显示灰色建议。
Tab 补全
举例:
cd /m<Tab>说明:
- 可以补全目录
- 可以补全命令
- 可以补全部分参数
语法高亮
解释颜色含义即可:
- 命令存在:通常显示为正常颜色
- 命令不存在:可能显示为错误颜色
- 路径存在:可被识别
- 路径不存在:会提示异常
历史命令搜索
- 上下键查看历史命令
- 输入一部分后,fish 会根据历史记录提供建议
fish 的基础使用
可以不学习,只是用基本的功能即可。需要执行脚本时指定 bash 进行处理。
常见命令和 Bash 一样吗?
大部分外部命令是一样的,例如:
ls、cd、pwd、mkdir、rm、cp、mv、cat、grep、find、tree、git因为这些不是 Bash 专属命令,而是 Linux 程序或工具。
哪些东西不一样?
重点列几个:
export PATH="$PATH:/xxx"在 fish 中写法不同:
set -gx PATH $PATH /xxxBash 里的别名:
alias ll='ls -al'fish 中也可以写:
alias ll='ls -al'但更推荐后面介绍 function。
fish 的配置文件在哪里?
fish 配置文件路径
~/.config/fish/config.fish如果目录不存在,可以创建:
mkdir -p ~/.config/fish
touch ~/.config/fish/config.fishconfig.fish 适合放什么?
建议放:
- 常用环境变量
- PATH 配置
- alias
- function
- Starship 初始化
- 常用工具初始化代码
常用配置示例:从简单到实用
设置常用别名
alias ll='ls -al'
alias la='ls -A'
alias ..='cd ..'设置环境变量
set -gx EDITOR vim配置 PATH
例如添加用户自己的 bin 目录:
set -gx PATH $HOME/.local/bin $PATH创建简单 function
例如:
function mkcd
mkdir -p $argv[1]
cd $argv[1]
end解释:
mkcd demo等价于:
mkdir -p demo
cd demo在 fish 中,function 比 alias 更适合写稍微复杂一点的命令。
是否要把 fish 设置为默认 shell?
什么是默认 shell
默认 shell 是指:每次打开 WSL Ubuntu 时,自动进入哪个 shell。
不建议一上来就改默认 shell
原因:
- Bash 是默认环境,出问题更容易查资料
- 很多教程默认使用 Bash
- fish 与 Bash 脚本语法不完全兼容
- 初学阶段可以先手动输入
fish使用
如果确认要设置为默认 shell
可以介绍思路:
which fish查看 fish 路径,例如:
/usr/bin/fish然后:
chsh -s /usr/bin/fish如果之后想切回 Bash:
chsh -s /bin/bash注意:
修改默认 shell 后,如果发现教程命令执行异常,可以先确认是不是 Bash 和 fish 语法差异导致的。
fish 与 Bash 的常见差异
这一章非常适合给已有 Bash 基础的学员。
环境变量写法不同
Bash:
export NAME=zhengxinfish:
set -gx NAME zhengxin变量读取方式类似,但设置方式不同
Bash:
name=zhengxin
echo $namefish:
set name zhengxin
echo $name命令替换写法不同
Bash 常见写法:
echo $(pwd)fish 也支持类似思路,但 fish 更常见:
echo (pwd)Bash 脚本不能直接当 fish 脚本运行
重点提醒:
.sh文件通常是 Bash/sh 脚本- 不要因为自己默认 shell 是 fish,就把所有 Bash 脚本改成 fish
- 教程里出现
export、source ~/.bashrc、VAR=value command时,要注意它们可能是 Bash 写法
可选增强:Starship、Fisher、主题与插件
starship 是什么?
简单说明:
- 一个跨 shell 的命令行提示符工具
- 可以显示 Git 分支、语言版本、目录状态等信息
- 支持 fish、bash、zsh 等多个 shell
Fisher 是什么?
简单说明:
- fish 的插件管理工具
- 可以安装插件、主题、补全增强
初学者推荐配置原则
建议:
- 先不用插件
- 先把 fish 原生功能用熟
- 需要美化提示符时,再考虑 Starship
- 需要插件时,再考虑 Fisher
常见问题与避坑
为什么 source ~/.bashrc 没有效果?
因为 fish 不读取 .bashrc,fish 的配置文件是:
~/.config/fish/config.fish注意
python 虚拟环境中常用的 source .venv/bin/activate 需要更换为 source .venv/bin/activate.fish
为什么有些安装脚本要求 Bash?
因为很多安装脚本是按 Bash/sh 语法写的。遇到这种情况,可以临时进入 Bash:
bash执行完成后再回到 fish。
fish 适合写脚本吗?
可以写,但不建议使用 fish 替代 Bash 脚本。
建议:
- 日常交互:fish
- 通用脚本:Bash/sh
- 复杂自动化:Python / Justfile / Makefile