shell 是什么,和终端、命令行有什么区别
shell 是接收你输入的命令、再交给操作系统执行的程序。终端(terminal)是负责显示和输入的窗口,命令行是你与 shell 交互的方式,脚本则是把命令写进文件批量执行。四者常被混用,但职责不同:终端管“界面”,shell 管“解释和执行”。如果你遇到 bash、zsh、sh 这些名字分不清,先记住一点——它们都是 shell,只是不同实现。
四者的分工
| 名称 | 角色 | 例子 |
|---|---|---|
| 终端 | 提供输入输出的界面/窗口 | iTerm2、Windows Terminal、GNOME Terminal |
| shell | 解释命令并调用系统执行 | bash、zsh、sh |
| 命令行 | 一种交互方式,你逐条输入命令 | 在提示符后敲 ls |
| 脚本 | 把多条命令写进文件,一次运行 | backup.sh |
终端本身不会执行 ls,它只是把你的按键传给 shell;真正理解 ls 含义、找到对应程序并运行的是 shell。
shell 做什么
shell 的核心工作有三件:
- 读取命令:解析你输入的一行内容,区分命令、参数、重定向、管道。
- 交给系统执行:找到对应程序(如
/bin/ls)并启动它。 - 返回结果:把输出显示回来,并给出退出状态码(0 表示成功)。
它同时是一门脚本语言,支持变量、条件、循环、函数,所以同一套语法既能交互输入,也能写成文件批量运行。
常见 shell 有哪些
- sh:最早的 Unix shell 规范,很多系统里它只是指向别的 shell 的链接。
- bash:GNU 项目开发,多数 Linux 发行版的默认 shell。
- zsh:Zsh 官网称它“为交互式使用而设计,同时也是强大的脚本语言”,在补全、提示符定制方面功能丰富,macOS 较新版本默认使用它。
- 其他:fish、ksh、dash 等,各有侧重。
登录后默认用哪个,由系统配置决定,不是由终端决定。同一个终端窗口里可以运行不同的 shell。
怎么确认和切换当前 shell
查看当前正在运行的 shell:
echo $SHELL # 显示登录 shell 的路径
ps -p $$ # 显示当前这个 shell 进程
$SHELL 是环境变量,反映登录时设定的 shell;ps -p $$ 看的是此刻真正在跑的进程,两者可能不一致。
临时切换到 zsh(只影响当前会话):
zsh
修改默认登录 shell:
chsh -s /bin/zsh
chsh 改的是登录 shell,需要该 shell 已安装在系统上,且路径写对。
遇到报错先查什么
- 命令找不到(command not found):确认该命令是否安装、是否在当前 shell 的
PATH里。 - 语法报错:先确认当前 shell 与脚本声明的解释器是否一致。脚本第一行的
#!/bin/bash或#!/bin/zsh决定用哪个 shell 执行,写错会出现“在 bash 里能跑、换 zsh 就报错”的情况。 - 行为不一致:不同 shell 对数组、通配、字符串处理的默认行为有差异,跨 shell 的脚本最好显式声明解释器。
想进一步了解 zsh 的发行版本、文档和邮件列表归档,可访问其官网 zsh.org,上面按地区列出了下载站点和常见问题入口。