bash和shell的区别:别再傻傻分不清了

很多人刚接触Linux或macOS终端时,常听到“shell”和“bash”这两个词,比如“换shell”“改bash配置”“zsh比bash好用”,但到底它们啥关系?是不是一回事?

Shell 是个统称,就像“手机”

Shell(壳)本质是用户和操作系统内核之间的交互程序。你敲命令、按回车、看到结果——这背后全靠它转达。它不是某个具体软件,而是一类程序的总称。常见的shell有:sh(Bourne Shell)、bash(Bourne-Again Shell)、zsh(Z Shell)、fishdash等。就像“手机”是个类别,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 是具体的人(比如“张师傅”);你每天打车,坐的可能是张师傅、李师傅、王师傅——他们都是司机,但开车习惯、爱听啥歌、会不会绕路,各有不同。