跳过正文

Fish Shell:开箱即用的交互式 Shell

·333 字·2 分钟
[你的名字]
作者
[你的名字]
用 Sony A7R2 记录光影,用 NixOS & Emacs 构建工作流,探索大模型与 Agent 的边界。
目录
NixOS 工具链 - 这篇文章属于一个选集。
§ 3: 本文

你第一次用 Fish 的时候,会疑惑:为什么其他 Shell 连自动补全都要自己配?

Fish(Friendly Interactive Shell)是一个为交互式使用设计的 Shell。它默认自带语法高亮、自动补全、模糊搜索,完全不需要像 Zsh 那样装 Oh-My-Zsh 和几十个个插件。

安装
#

NixOS:

users.defaultUserShell = pkgs.fish;
programs.fish.enable = true;

或者 Home Manager:

programs.fish = {
  enable = true;
  interactiveShellInit = ''
    set -g fish_greeting
  '';
};

为什么从 Zsh 换到 Fish
#

功能Zsh (默认)Fish (默认)
语法高亮❌ 需插件✅ 内置
自动建议❌ 需插件✅ 内置
模糊补全❌ 需插件✅ 内置
Man Page 补全✅ 自动生成
配置语法Bash 兼容简洁直观
启动速度慢(插件多)

Fish 的哲学是「默认就应该是最好的」。

日常使用
#

自动建议
#

输入命令时,Fish 会根据历史记录和当前路径,在灰色文字中显示建议:

$ git comm
         ↑ 灰色显示 "git commit -m "
         → 按 → 或 Ctrl+F 接受建议

Tab 补全
#

Tab 自动列出所有可能选项,支持模糊匹配:

$ cd pro<Tab>
projects/  proposals/  prometheus/

语法高亮
#

命令正确时绿色,错误时红色,路径存在时蓝色,不存在时红色下划线:

$ ech hello      # "ech" 红色(命令不存在)
$ cat /tmp/test  # "/tmp/test" 红色下划线(文件不存在)

配置
#

Fish 的配置在 ~/.config/fish/

~/.config/fish/
├── config.fish      # 主配置
├── conf.d/          # 自动加载的脚本
│   ├── abbr.fish
│   ├── aliases.fish
│   └── path.fish
└── functions/       # 自定义函数

我的 config.fish
#

# 去掉欢迎语
set -g fish_greeting

# 环境变量
set -gx EDITOR emacsclient -c
set -gx VISUAL emacsclient -c
set -gx LANG en_US.UTF-8

# PATH
fish_add_path ~/.cargo/bin
fish_add_path ~/.local/bin
fish_add_path /nix/var/nix/profiles/default/bin

缩写(abbr)vs 别名
#

Fish 推荐用 abbr 代替 alias,因为缩写会在输入时自动展开,你可以看到实际执行的命令:

abbr -a g git
abbr -a ga 'git add'
abbr -a gc 'git commit'
abbr -a gp 'git push'
abbr -a gs 'git status'
abbr -a l 'ls -la'
abbr -a .. 'cd ..'
abbr -a ... 'cd ../..'

效果:输入 gs 按空格,自动展开为 git status

自定义函数
#

# ~/.config/fish/functions/ll.fish
function ll
    ls -lah $argv
end
# ~/.config/fish/functions/mkcd.fish
function mkcd
    mkdir -p $argv[1]
    cd $argv[1]
end

NixOS 特有的技巧
#

nix-shell 自动进入 Fish
#

# config.fish
if test -n "$IN_NIX_SHELL"
    set -g fish_greeting "📦 nix-shell"
end

用 direnv + nix-direnv
#

# home.nix
programs.direnv = {
  enable = true;
  nix-direnv.enable = true;
};

进入带 .envrc 的目录时自动加载开发环境,退出时自动卸载。

不兼容 Bash 的注意事项
#

Fish 的语法和 Bash 不同,如果你写脚本,建议:

  1. 脚本文件头部用 #!/usr/bin/env bash — 保持 Bash 写脚本的习惯
  2. Fish 只用于交互式使用 — 不要拿 Fish 写脚本
  3. 复制粘贴网上的 Bash 命令时 — 大部分简单命令兼容,复杂管道可能需要调整

总结
#

如果你厌倦了配置 Zsh,Fish 是最省心的选择。它不会让你成为一个「Shell 配置专家」,但它会让你每天打开终端时心情更好一点。


NixOS 工具链系列至此暂告一段落,接下来可能会写一些具体的 Nix 配置技巧。

NixOS 工具链 - 这篇文章属于一个选集。
§ 3: 本文