很多人在用Linux或者macOS时,经常听到shell和bash这两个词,感觉差不多,好像说的是一件事。其实它们不是同一个东西,有点像“手机”和“iPhone”的关系。
shell 是个统称
shell 其实是一个程序,是用户和操作系统之间的“中间人”。你输入命令,它负责解释并执行,比如列出文件、创建目录、运行脚本等等。你可以把它想象成一个翻译官——你说中文(命令),它去跟系统讲机器能听懂的话。
但shell不是只有一个版本,就像浏览器有Chrome、Firefox、Safari一样,shell也有好几种:sh、bash、zsh、fish 等等。它们功能类似,但细节上有些差别。
bash 是 shell 的一种
bash 全名是 Bourne-Again Shell,它是 sh 的增强版,不仅兼容 sh 的语法,还加了不少新功能,比如命令补全、历史记录、更方便的变量操作等。
现在大多数Linux发行版和macOS默认的shell就是bash。你在终端里敲命令的时候,大概率就是在用bash。
举个生活中的例子:shell 像是“饮料机”,而 bash 就是这台机器里的“可乐选项”。你按一下可乐,机器就出可乐;你设置系统用bash,那它就跑bash。
怎么知道自己用的是哪个shell?
打开终端,输入下面这行命令:
echo $0
或者更准确一点:
echo $SHELL
如果输出是 /bin/bash,那你当前用的就是bash。如果是 /bin/zsh,那就是zsh。
脚本开头的 #! 有什么用?
你可能见过shell脚本第一行写着:
#!/bin/bash
这叫 shebang,意思是“这个脚本要用bash来执行”。就算系统默认shell是别的,加上这行就能确保它用bash跑,避免出错。
如果不写,而是写成:
#!/bin/sh
那就表示用最基础的sh来执行,兼容性更好,但不能用bash特有的功能。
日常使用影响大吗?
对普通用户来说,基本没太大感觉。你敲 ls、cd、pwd 这些命令,在bash和sh里都一样能用。但如果你写脚本,或者自定义提示符、快捷键,那选哪个shell就有区别了。
比如,你设置了按Tab自动补全路径,还能用上下箭头翻历史命令,这些高级功能其实是bash提供的,原始的sh可能就不支持。
现在很多新电脑开始用zsh作为默认shell(比如macOS Catalina之后),但bash依然是最常见、最广泛支持的选择。