Shell 的种类

Shell 不止一种,不同 Shell 有不同的特点和适用场景。选对了,效率翻倍。

Bourne Shell 家族

sh(Bourne Shell)

最早期的 Shell,1977 年由 Stephen Bourne 在贝尔实验室开发。语法简洁,几乎所有 Unix 系统都预装。但功能有限,不支持命令历史、别名这些现代功能。

现在很少直接用 sh,但很多脚本开头写着 #!/bin/sh,表示用 Bourne Shell 兼容的方式执行。

Bash(Bourne Again Shell)

Bash 是 sh 的增强版,GNU 项目的一部分。它继承了 sh 的语法,又加了很多实用功能:

  • 命令历史(上下箭头翻历史)
  • Tab 补全
  • 命令别名
  • 数组支持
  • 算术运算

Bash 是 Linux 发行版的默认 Shell,也是使用最广的 Shell。学 Shell 编程,Bash 是首选。

# 查看 Bash 版本
bash --version

C Shell 家族

csh(C Shell)

语法类似 C 语言,由 Bill Joy 在 1978 年开发。对 C 程序员友好,但和其他 Shell 语法差异大,脚本通用性差。

tcsh

csh 的增强版,加了命令行编辑、自动补全等功能。FreeBSD 默认用 tcsh。

C Shell 家族现在用得不多,主要是语法和主流的 Bourne 家族差别太大。

现代 Shell

Zsh(Z Shell)

Zsh 可以说是 Bash 的超集,兼容 Bash 语法,同时更强大:

  • 更智能的 Tab 补全(支持命令参数补全)
  • 拼写纠错
  • 主题和插件系统
  • 右侧提示符

配合 Oh My Zsh 框架,Zsh 变得非常好用:

# 安装 Oh My Zsh
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

很多开发者已经从 Bash 转向 Zsh。

Fish(Friendly Interactive Shell)

Fish 的设计理念是"开箱即用":

  • 自动建议(根据历史灰显提示)
  • 语法高亮(命令输对了是绿色,错了是红色)
  • 简洁的脚本语法

Fish 很友好,但语法和 Bash 不兼容。写脚本时要注意这点。

# Fish 定义函数的方式
function greet
    echo "Hello, $argv"
end

其他 Shell

Dash(Debian Almquist Shell)

轻量级 Shell,比 Bash 快,占用资源少。Debian 和 Ubuntu 用它替代 /bin/sh。写脚本时,如果追求兼容性,建议用 sh 语法而不是 Bash 特有语法。

Ksh(Korn Shell)

功能强大,是 Bash 的前辈。在商业 Unix 系统上比较常见。

如何选择

场景推荐
学习 Shell 编程Bash
日常终端使用Zsh 或 Fish
写兼容性脚本用 sh 语法
追求启动速度Dash

查看和切换 Shell

# 查看当前 Shell
echo $SHELL

# 查看系统安装的 Shell
cat /etc/shells

# 临时切换
zsh        # 切换到 zsh
bash       # 切换到 bash
exit       # 退出当前 Shell

# 永久切换
chsh -s /bin/zsh

小结

Bash 是最稳妥的选择,资料多、兼容性好。Zsh 适合追求效率的开发者。Fish 适合不想折腾的新手。不管选哪个,先把一个学精,其他的触类旁通。