终端、shell

Shell 是 UNIX/Linux 系统中最为重要的应用程序之一,负责解释执行用户指令,打印结果,和用户交互,进行着REPL(Read-Evaluate-Print Loop)。sh、bash、zsh、fish等都是Shell的具体实例。

系统内核接管计算机资源,设备和程序在系统内核的调配下运转,终端设备仅仅是一个IO外设——将用户的指令输入给主机,将主机的返回结果输出给用户。

操作系统(四)终端 - 图1

历史

计算机发明初期一个专门的操作台,操作人员通过这个操作台拔插电线,结果同时反馈到操作台,这个操作台就叫“控制台(Console)”。

控制台可以实现对计算机的完全操控,用来管理计算机,但不方便给用户服务。后来计算机技术发展,计算能力不断提升并出现了多用户操作系统(特别是UNIX),允许每个用户通过终端设备(Terminal)与主机连接,操作系统管理员给每个用户分配一个账户,“登录”到系统获得计算机使用权,这时计算机才算实现了服务用途。

从1970年代末期开始,电子视频终端(video terminal)开始取代电传打字机成为主流的终端设备,带缓存功能,允许用户在传给主机之前修改输入信息。

终端模块

UNIX/Linux内核中有3个模块共同支持终端设备:读写函数、终端行规程(terminal line discipline,也有译作“终端线路规程”)、字符设备驱动。

应用程序(shell)通过tty_read、tty_write等函数对终端字符设备发起读写操作,终端行规程作用类似于过滤器,对读写的字符做特殊处理,比如将按键Ctrl-C、Ctrl-Z等特殊字符解释成相关信号发给前台进程,并不让应用程序读到,真正可读写的字符才会进一步传递给应用程序或tty字符设备驱动程序,驱动程序再去操作设备本身。终端行规程可看作是人机交互的通用规范。

操作系统(四)终端 - 图2

shell

终端自身并不执行用户输入的命令,它只是负责把输入的内容传送到主机系统,并把主机系统返回的结果呈现给用户。负责解释执行用户输入的命令并返回结果的,正是Shell!它是沟通用户和系统内核的中间桥梁。

硬件的驱动只能通过一种称为“操作系统(OS,Opertating System)”的软件来管控。 事实上,我们每天所谈的“linux”,严格来说只是一个操作系统(OS), 我们称之为“内核(kernel)”。

使用者没有办法直接操作一个kernel, 而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。shell最简单的定义就是——命令解释器( Command Interpreter)

  • 将使用者的命令翻译给 kernel 来处理;

  • 同时,将 kernel 的处理结果翻译给使用者。

这种工作方式被称为交互式Shell(Interactive Shell),Shell通常还支持批处理方式(Batch),用户提前写好要执行的命令,形成脚本(Shell Script),Shell一次性把脚本中的命令执行完。