很多人刚接触Linux或macOS终端时,常听到“shell”和“bash”这两个词,比如“换shell”“改bash配置”“zsh比bash好用”,但到底它们啥关系?是不是一回事?
Shell 是个统称,就像“手机”
Shell(壳)本质是用户和操作系统内核之间的交互程序。你敲命令、按回车、看到结果——这背后全靠它转达。它不是某个具体软件,而是一类程序的总称。常见的shell有:sh(Bourne Shell)、bash(Bourne-Again Shell)、zsh(Z Shell)、fish、dash等。就像“手机”是个类别,iPhone、华为、小米都是具体型号。
Bash 是 shell 的一种,而且是最常用的那个
Bash 全名 Bourne-Again Shell,是 sh 的增强版,由 GNU 项目开发。它兼容 sh 的基本语法,又加了历史命令、命令补全、数组、条件判断等实用功能。Linux 发行版默认大多用 bash(Ubuntu 20.04 及以前)、macOS 在 Catalina 之前也默认 bash。
你可以用这条命令看当前用的是哪个 shell:
echo $SHELL
输出可能是 /bin/bash 或 /bin/zsh —— 这说明你当前登录用的 shell 是 bash 或 zsh。
一个小实验:sh 和 bash 看似一样,其实有差别
新建一个脚本 test.sh:
#!/bin/sh
name="world"
echo "Hello $name!"
运行它没问题。但如果改成 bash 特有的语法:
#!/bin/bash
name="world"
echo "Hello $name!"
[[ $name == "world" ]] && echo "Matched!"
把第一行换成 #!/bin/sh 再运行,第二段就会报错——因为 [[ ]] 是 bash 扩展,sh 不认。
别混淆:/bin/sh 不一定等于 bash
在很多系统里,/bin/sh 其实是 dash(更轻量、更 POSIX 兼容),不是 bash 的软链接。比如 Ubuntu 自从 6.10 就把 /bin/sh 指向 dash,为的是启动更快、更安全。所以写脚本时,如果用了 [[ ]]、source、数组,就老老实实写 #!/bin/bash,别图省事写 #!/bin/sh。
怎么切换 shell?
想试试 zsh?终端里直接输:
zsh
就临时进去了。要永久改默认 shell,用:
chsh -s $(which zsh)
改完重新登录才生效。注意:chsh 改的是登录 shell,不影响你当前终端里正在跑的 bash 进程。
一句话记牢
Shell 是角色名(比如“司机”),bash 是具体的人(比如“张师傅”);你每天打车,坐的可能是张师傅、李师傅、王师傅——他们都是司机,但开车习惯、爱听啥歌、会不会绕路,各有不同。