跳转到内容

fish-shell — 友好交互式命令行 Shell

是什么

fish(friendly interactive shell)是面向 macOS/Linux 的交互式命令行 shell:开箱提供语法高亮、输入时自动建议(autosuggest-as-you-type)、智能 Tab 补全,无需像 zsh+Oh My Zsh 那样重度配置。3.0+ 核心用 Rust 重写,CMake/Cargo 双构建路径。

日常类比:如果 bash 是手动挡基型车,fish 像带 L2 辅助的自动挡——默认就好用,但脚本语法与 POSIX bash 不完全兼容(故意设计)。

与 bash/zsh 的关键差异见官方教程搜 “unlike other shells”——写脚本前必读。

为什么重要

不懂 fish,终端 UX 讨论会缺「零配置友好派」代表:

  • 降低新手门槛:高亮+建议让命令行探索成本下降
  • starship/zsh 形成对照:starship 跨 shell 美化 prompt;fish 自带完整交互体验
  • 被 gum 等项目引用gum 等 TUI 工具文档常假设现代 shell 体验
  • Rust 迁移示范:大型 C++ shell 重写为 Rust 的成功案例

核心要点

  1. 交互 vs 脚本分离:fish 擅长交互;生产 cron 脚本仍用 bash/sh——fish 语法不同(如无 $() 与 bash 完全一致)。

  2. 自动建议来自历史:↑ 接受整行建议;历史存在 ~/.local/share/fish/fish_history

  3. Web 配置 fish_config:浏览器 UI 改 prompt/颜色/函数——比手改 dotfiles 直观。

实践案例

案例 1:安装并切换默认 shell

Terminal window
# macOS
brew install fish
# Ubuntu PPA
sudo apt-add-repository ppa:fish-shell/release-4
sudo apt update && sudo apt install fish
# 试跑(不改默认)
fish

安装后运行 fish 即可体验;设默认:chsh -s $(which fish)(mac 需在系统设置批准)。

案例 2:常用交互技巧

# fish 中设置环境变量(export 持久化)
set -Ux MY_API_KEY "sk-..."
# 函数
function ll
ls -la $argv
end
# 查看帮助
help set

set -Ux 写 universal 变量,所有 session 共享。

案例 3:从源码 Cargo 安装(最新 dev)

Terminal window
git clone https://github.com/fish-shell/fish-shell
cd fish-shell
cargo install --path .
# 二进制在 ~/.cargo/bin/fish

适合追新 feature;日常用户用 brew/PPA 稳定版即可。

案例 4:与 starship 联用

~/.config/fish/config.fish
starship init fish | source

starship 跨 shell 提供 git/目录/k8s 段;fish 负责补全与高亮,starship 负责 prompt 信息密度。

踩过的坑

  1. bash 脚本直接 fish 跑会语法错误[[$() 嵌套等与 fish 不同——交互用 fish,脚本头仍 #!/bin/bash

  2. shebang 机器无 fish:远程服务器默认 sh 执行 fish 语法脚本会挂——部署脚本别用 fish shebang。

  3. PATH 与 conda/nvm 初始化:第三方 env 安装器常只 hook bash/zsh——要手动写 fish config.fish 兼容块。

  4. Cargo 构建缺 Sphinx--help 文档生成要 Sphinx;纯 cargo install 可能只有二进制无 man page。

适用 vs 不适用场景

适用:

  • 日常交互式终端、探索 CLI 工具
  • 新手从 GUI 过渡到命令行
  • 想要现代 UX 但不想维护庞大 dotfiles

不适用:

  • 必须 POSIX 兼容的运维脚本
  • 远程 ancient 系统无 root 装 fish
  • CI 环境(几乎总是 bash/sh)

历史小故事(可跳过)

  • 2005:axel@Lovstrand 发起 fish 项目
  • 2010s:语法高亮与建议成为招牌
  • 2020s:Rust 重写核心;3.x 大版本
  • :与 zshbash(若写)、starship 共存于开发者工具链

学到什么

  • Shell 选型 = 交互 UX vs 脚本 POSIX,fish 偏向前者
  • 自动建议基于历史是低成本 productivity win
  • 大型 CLI 工具 Rust 化趋势(fish 3.x)值得跟踪

延伸阅读

关联

  • zsh —— 传统可配置 shell
  • starship —— prompt 美化(常与 fish 联用)
  • gum —— 现代 TUI,文档常引用 fish 体验
  • ripgrep —— fish 补全友好
  • fzf —— 可与 fish 键绑集成
  • homebrew —— macOS 安装路径
  • nix —— nixpkgs 也可提供 fish

反向链接

  • fzf —— fzf — 命令行模糊查找
  • gum —— gum — 把 TUI 组件搬进 shell 脚本
  • nix —— Nix — 函数式声明式包管理与可重复构建
  • ripgrep —— ripgrep — Rust 写的现代 grep
  • starship —— Starship — 一份配置点亮所有 shell 的 prompt
  • vim —— Vim — 模态编辑器之父
  • zsh —— zsh — 比 bash 更聪明的兼容派 shell