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 的核心工作有三件:

  1. 读取命令:解析你输入的一行内容,区分命令、参数、重定向、管道。
  2. 交给系统执行:找到对应程序(如 /bin/ls)并启动它。
  3. 返回结果:把输出显示回来,并给出退出状态码(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,上面按地区列出了下载站点和常见问题入口。

zsh.org