Skip to content

fish

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

为什么要使用 fish?

fish 是一个用户友好的命令行 shell,内置语法高亮、自动建议、Tab 补全等功能,很多功能不需要额外配置即可使用。

相比 fish 而言还有一个更出名的 zsh 与 on-my-zsh,但是配置太麻烦了,这里推荐 fish 开箱即用

  • Bash 是默认且通用的 shell,虽然能用但是不够好用。
  • fish 更偏向“开箱即用”和交互体验
  • fish 适合日常命令行使用,不一定适合替代所有脚本场景

Bash 与 fish 的关系

建议用对比方式讲:

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

重点:fish 不是 Ubuntu,也不是 WSL,而是替代 Bash 使用的一种 shell。

安装

使用 apt 安装 fish

shell
sudo apt update
sudo apt upgrade
sudo apt install fish
  • apt update:更新软件列表
  • apt upgrade:升级已安装软件
  • sudo:以管理员权限执行

启动 fish

shell
fish

退出 fish,回到 Bash

shell
exit
# or
bash

fish 官方文档也把安装、启动、退出、设置默认 shell 放在 Setup 部分,适合作为这一章的主线。

fish 比 Bash 方便在哪里

命令自动建议

举例:

shell
cd /mnt/

当你输入类似历史命令的前半部分时,fish 会显示灰色建议。

Tab 补全

举例:

shell
cd /m<Tab>

说明:

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

语法高亮

解释颜色含义即可:

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

历史命令搜索

  • 上下键查看历史命令
  • 输入一部分后,fish 会根据历史记录提供建议

fish 的基础使用

可以不学习,只是用基本的功能即可。需要执行脚本时指定 bash 进行处理。

常见命令和 Bash 一样吗?

大部分外部命令是一样的,例如:

shell
ls、cd、pwd、mkdir、rm、cp、mv、cat、grep、find、tree、git

因为这些不是 Bash 专属命令,而是 Linux 程序或工具。

哪些东西不一样?

重点列几个:

shell
export PATH="$PATH:/xxx"

在 fish 中写法不同:

shell
set -gx PATH $PATH /xxx

Bash 里的别名:

shell
alias ll='ls -al'

fish 中也可以写:

shell
alias ll='ls -al'

但更推荐后面介绍 function。

fish 的配置文件在哪里?

fish 配置文件路径

shell
~/.config/fish/config.fish

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

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

config.fish 适合放什么?

建议放:

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

常用配置示例:从简单到实用

设置常用别名

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

设置环境变量

shell
set -gx EDITOR vim

配置 PATH

例如添加用户自己的 bin 目录:

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

创建简单 function

例如:

fish
function mkcd
    mkdir -p $argv[1]
    cd $argv[1]
end

解释:

fish
mkcd demo

等价于:

fish
mkdir -p demo
cd demo

在 fish 中,function 比 alias 更适合写稍微复杂一点的命令。

是否要把 fish 设置为默认 shell?

什么是默认 shell

默认 shell 是指:每次打开 WSL Ubuntu 时,自动进入哪个 shell。

不建议一上来就改默认 shell

原因:

  • Bash 是默认环境,出问题更容易查资料
  • 很多教程默认使用 Bash
  • fish 与 Bash 脚本语法不完全兼容
  • 初学阶段可以先手动输入 fish 使用

如果确认要设置为默认 shell

可以介绍思路:

shell
which fish

查看 fish 路径,例如:

shell
/usr/bin/fish

然后:

shell
chsh -s /usr/bin/fish

如果之后想切回 Bash:

shell
chsh -s /bin/bash

注意:

修改默认 shell 后,如果发现教程命令执行异常,可以先确认是不是 Bash 和 fish 语法差异导致的。

fish 与 Bash 的常见差异

这一章非常适合给已有 Bash 基础的学员。

环境变量写法不同

Bash:

shell
export NAME=zhengxin

fish:

shell
set -gx NAME zhengxin

变量读取方式类似,但设置方式不同

Bash:

shell
name=zhengxin
echo $name

fish:

shell
set name zhengxin
echo $name

命令替换写法不同

Bash 常见写法:

shell
echo $(pwd)

fish 也支持类似思路,但 fish 更常见:

shell
echo (pwd)

Bash 脚本不能直接当 fish 脚本运行

重点提醒:

  • .sh 文件通常是 Bash/sh 脚本
  • 不要因为自己默认 shell 是 fish,就把所有 Bash 脚本改成 fish
  • 教程里出现 exportsource ~/.bashrcVAR=value command 时,要注意它们可能是 Bash 写法

可选增强:Starship、Fisher、主题与插件

starship 是什么?

简单说明:

  • 一个跨 shell 的命令行提示符工具
  • 可以显示 Git 分支、语言版本、目录状态等信息
  • 支持 fish、bash、zsh 等多个 shell

Fisher 是什么?

简单说明:

  • fish 的插件管理工具
  • 可以安装插件、主题、补全增强

初学者推荐配置原则

建议:

  • 先不用插件
  • 先把 fish 原生功能用熟
  • 需要美化提示符时,再考虑 Starship
  • 需要插件时,再考虑 Fisher

常见问题与避坑

为什么 source ~/.bashrc 没有效果?

因为 fish 不读取 .bashrc,fish 的配置文件是:

shell
~/.config/fish/config.fish

注意

python 虚拟环境中常用的 source .venv/bin/activate 需要更换为 source .venv/bin/activate.fish

为什么有些安装脚本要求 Bash?

因为很多安装脚本是按 Bash/sh 语法写的。遇到这种情况,可以临时进入 Bash:

shell
bash

执行完成后再回到 fish。

fish 适合写脚本吗?

可以写,但不建议使用 fish 替代 Bash 脚本。

建议:

  • 日常交互:fish
  • 通用脚本:Bash/sh
  • 复杂自动化:Python / Justfile / Makefile