前言
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 后,可以直接运行命令安装这些提升体验的神器:
- Pure (简洁美观的主题)
fisher install pure-fish/pure这是一个非常干净、现代化的 Prompt 主题,显示效果极佳。 - Done (任务完成提醒)
fisher install franciscolourenco/done如果你运行了一个耗时很长的命令(比如编译、备份),当它结束时,即使你在看别的窗口,它也会发个通知提醒你。 - 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 输出的是一串字符串。如果你想过滤文件大小,你得用 grep、awk、cut 去苦哈哈地切分字符串。 在 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
程序设计实验室
微信公众号