前言

Linux 服务器一般默认 shell 都是 bash,不太智能,可以用现代化的 shell 来优化命令行的体验。

zsh 是个不错的选择,但默认也是很丑,需要搭配 Oh My Zsh 挺麻烦的,本文介绍现在比较新、开箱即用的 shell 安装和简单使用方法。

如果直接用 chsh 命令修改默认登录 Shell(Login Shell),一些依赖 Bash 特定环境变量(如 /etc/profile 里的设置)的系统脚本或自动化任务可能会因为找不到 Bash 环境而报错。

思路:在 Bash 里启动现代 Shell。

三大现代 Shell 哪家强?

这三者各具特色,可以根据口味选择:

🐟 Fish

(Friendly Interactive SHell) 最省心的“全能选手”

  • 特点:开箱即用。自带语法高亮、智能补全(基于你的历史记录和 Man 手册)、非常漂亮的颜色。
  • 评价最好上手。 如果你不想折腾配置,只想装上就变强,Fish 是首选。
  • 缺点:虽然从 4.0 开始重写了部分引擎,但它依然不是 POSIX 兼容的(例如 VAR=val cmd 这种写法在旧版 Fish 中不支持)。

🦀 Nushell

(Nu) 像 SQL 一样处理数据的“未来派”

  • 特点万物皆对象。在 Nu 里,ls 返回的不是一串文本,而是一个表格。你可以直接用 ls | where size > 10mb 这种语法。
  • 评价最极客、最好玩。 它不仅仅是 Shell,更像是一个现代化的数据处理工具。如果你经常处理 JSON、CSV 或大批量日志,它会让你爽到飞起。
  • 缺点:学习曲线较陡,有些传统命令的写法需要重新适应。

🧝 Elvish

程序员的“优雅语言”

  • 特点:它试图把 Shell 变成一种真正的、强大的编程语言。支持复杂的结构(Map、List),甚至有自己的包管理器。
  • 评价最稳健、逻辑最严密。 适合那些觉得 Bash 脚本语法很“阴间”并希望用现代编程思维写脚本的人。
  • 缺点:社区生态相对小一些。

Tips

Nushell 和 Elvish 都是跨平台的,意味着可以在 Windows、macOS、Linux 上获得一致的体验。Fish 的话我只在 Linux 上用过,没有研究其他系统是否能用。

Fish

安装 Fish

# Ubuntu/Debian
sudo apt update && sudo apt install fish -y

安装 Fisher (插件管理器)

这是目前最好用的工具,建议先装上它,在 fish 里执行以下命令:

curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher

配置启动逻辑

~/.bashrc 文件末尾添加以下逻辑:

# 检查是否是交互式会话,且目标 shell 存在
if [[ $- == *i* ]] && command -v fish >/dev/null 2>&1; then
    exec fish
fi
  • [[ $- == \*i\* ]]: 确保只在交互式命令行(你手动操作时)触发。如果是不带终端的脚本运行,它不会启动,避免弄断自动化流程。
  • exec: 这个词很关键。它会用新进程替换当前进程,这样当你退出 fish 时,连接会直接关闭,而不是退回到一个空白的 bash

推荐几个好玩的插件/主题

安装好 Fisher 后,可以直接运行命令安装这些提升体验的神器:

  1. Pure (简洁美观的主题) fisher install pure-fish/pure 这是一个非常干净、现代化的 Prompt 主题,显示效果极佳。
  2. Done (任务完成提醒) fisher install franciscolourenco/done 如果你运行了一个耗时很长的命令(比如编译、备份),当它结束时,即使你在看别的窗口,它也会发个通知提醒你。
  3. Bass (兼容 Bash 脚本) fisher install edc/bass 这个对你最重要! 因为 Fish 不兼容 Bash 语法,如果你需要运行 source /etc/profile 这种命令,在 Fish 里会报错。装了 Bass 后,你可以写成 bass source /etc/profile,它会帮你搞定兼容性。

小技巧

  • Web 界面配置:在 Fish 终端输入 fish_config。它会自动弹出一个浏览器网页,让你用鼠标点点就能修改配色方案和函数,非常直观。
  • 智能补全:Fish 的补全基于你的历史记录。当你输入一个命令的前几个字母,它会灰显显示建议,按 右方向键 (→)Ctrl + F 就能直接填入。

我全都要

Nushell (Nu)

数据处理的“降维打击”

Nushell 是目前社区讨论度最高、最硬核的现代 Shell。它的核心逻辑是:一切皆结构化数据

为什么它好玩?

在传统的 Shell 里,ls 输出的是一串字符串。如果你想过滤文件大小,你得用 grepawkcut 去苦哈哈地切分字符串。 在 Nushell 里,ls 输出的是一个内存中的表格

体验一下:

ls | where size > 10mb | sort-by type

它会像 SQL 一样直接过滤出大于 10MB 的文件并按类型排序,输出的还是整齐的表格。

处理 JSON/YAML 神器: 如果你有一个 config.json,在 Nu 里只需要:

open config.json | get database.port

它直接就把值取出来了,完全不需要安装 jq

安装

https://www.nushell.sh/book/installation.html

Nushell 是用 Rust 写的,非常快。可以直接下载二进制文件或者通过包管理器。

wget -qO- https://apt.fury.io/nushell/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/fury-nushell.gpg
echo "deb [signed-by=/etc/apt/keyrings/fury-nushell.gpg] https://apt.fury.io/nushell/ /" | sudo tee /etc/apt/sources.list.d/fury-nushell.list
sudo apt update
sudo apt install nushell

Elvish

程序员的“瑞士军刀”

Elvish (精灵语) 走的是极致稳健编程友好路线。它的作者是华裔开发者 Qi Xiao,设计哲学非常严谨。

为什么它好玩?

  • 不会崩的管道:在 Bash 里,管道传输的是字节流;在 Elvish 里,管道可以传输复杂的数据结构(列表、字典)。
  • 自带文件管理器:按 Ctrl+R 搜索历史记录的界面非常华丽;按 Ctrl+L 会进入一个类似 ranger 的浮动文件导航模式,直接在 Shell 里选文件。
  • 语法极度统一:它彻底抛弃了 Bash 那些零碎的语法(比如 [[[ 的区别),它的脚本写起来就像是在写一种现代编程语言。

安装

https://elv.sh/get/package-manager.html

sudo apt install elvish

配置启动逻辑

~/.bashrc 里做一个选择器

每次登录都会询问要用哪个 shell (要我说就是 fish 好了,开箱即用)

# 交互模式下询问你想进入哪个宇宙
if [[ $- == *i* ]]; then
    echo "Choose your shell: [1] Fish  [2] Nushell  [3] Elvish  [Any] Stay in Bash"
    read -n 1 -p "Select: " choice
    echo
    case $choice in
        1) exec fish ;;
        2) exec nu ;;
        3) exec elvish ;;
        *) echo "Welcome back to Bash." ;;
    esac
fi