Shell 不止一种,不同 Shell 有不同的特点和适用场景。选对了,效率翻倍。
sh(Bourne Shell)
最早期的 Shell,1977 年由 Stephen Bourne 在贝尔实验室开发。语法简洁,几乎所有 Unix 系统都预装。但功能有限,不支持命令历史、别名这些现代功能。
现在很少直接用 sh,但很多脚本开头写着 #!/bin/sh,表示用 Bourne Shell 兼容的方式执行。
Bash(Bourne Again Shell)
Bash 是 sh 的增强版,GNU 项目的一部分。它继承了 sh 的语法,又加了很多实用功能:
Bash 是 Linux 发行版的默认 Shell,也是使用最广的 Shell。学 Shell 编程,Bash 是首选。
# 查看 Bash 版本
bash --version
csh(C Shell)
语法类似 C 语言,由 Bill Joy 在 1978 年开发。对 C 程序员友好,但和其他 Shell 语法差异大,脚本通用性差。
tcsh
csh 的增强版,加了命令行编辑、自动补全等功能。FreeBSD 默认用 tcsh。
C Shell 家族现在用得不多,主要是语法和主流的 Bourne 家族差别太大。
Zsh(Z Shell)
Zsh 可以说是 Bash 的超集,兼容 Bash 语法,同时更强大:
配合 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
Dash(Debian Almquist Shell)
轻量级 Shell,比 Bash 快,占用资源少。Debian 和 Ubuntu 用它替代 /bin/sh。写脚本时,如果追求兼容性,建议用 sh 语法而不是 Bash 特有语法。
Ksh(Korn Shell)
功能强大,是 Bash 的前辈。在商业 Unix 系统上比较常见。
| 场景 | 推荐 |
|---|---|
| 学习 Shell 编程 | Bash |
| 日常终端使用 | Zsh 或 Fish |
| 写兼容性脚本 | 用 sh 语法 |
| 追求启动速度 | Dash |
# 查看当前 Shell
echo $SHELL
# 查看系统安装的 Shell
cat /etc/shells
# 临时切换
zsh # 切换到 zsh
bash # 切换到 bash
exit # 退出当前 Shell
# 永久切换
chsh -s /bin/zsh
Bash 是最稳妥的选择,资料多、兼容性好。Zsh 适合追求效率的开发者。Fish 适合不想折腾的新手。不管选哪个,先把一个学精,其他的触类旁通。