* terminal = text input/output environment
从技术上讲,终端窗口,也被称为终端模拟器,是图形用户界面(GUI)中的一个纯文本窗口,用来模拟控制台。
Technically , A terminal window, also referred to as a terminal emulator, is a text-only window in a graphical user interface (GUI) that emulates a console.
* console = physical terminal
一个用来控制计算机的面板设备。
An instrument panel containing the controls for a computer。
* shell = command line interpreter
是一个用来运行命令的应用。
控制台Console和终端terminal 是密切相关的。最初,它们指的是一块设备,你可以通过它与计算机进行交互:在unix的早期,这意味着一个类似于打字机的电传打字机式( teleprinter-style)的设备,有时被称为电传打字机(teletypewriter),或简称 "tty"。终端(terminal)这个名字是从电子角度来的,而 "控制台 "(console)这个名字是从设备角度来说的。在unix历史的早期,电子键盘和显示器成为终端(terminals)的标准。
Terminal
在unix术语中,终端是一种特殊的设备文件,除了读写之外,还实现了一些额外的命令(ioctls)。有些终端是由内核提供的,用来代表一个硬件设备,例如,从键盘的输入,输出到文本模式的屏幕,或者通过串行线进行输入和输出。其他终端,有时被称为伪终端或伪ttys,由称为终端仿真器的程序提供(通过一个轻量级的内核层)。一些类型的终端仿真器包括:
- 在X Window System中运行的GUI(Graphical user interface)应用程序:Xterm、Gnome Terminal、Konsole、Terminator等。
- Screen和tmux,它在一个程序和另一个终端之间提供了一个隔离层。
- ssh,它将一台机器上的终端与另一台机器上的程序连接起来
- Expect,用于编写终端交互的脚本
终端这个词也可以有更传统的含义,即人们通过它与计算机进行交互的设备,通常有一个键盘和显示器。例如,X terminal是一种瘦客户端,是一种特殊用途的计算机,其唯一目的是驱动键盘、显示器、鼠标和偶尔的其他人机交互外围设备,而实际的应用程序则在另一台更强大的计算机上运行。
Console
控制台一般是指物理意义上的终端,根据某种定义,它是直接连接到机器上的主要终端。控制台在操作系统中显示为一个(由内核实现的)终端。在一些系统中,如Linux和FreeBSD,控制台以几个终端(ttys)的形式出现(使用特殊的组合键在这些终端之间切换);为了混淆视听,给每个特定终端的名称可以是 "控制台"、"虚拟控制台"、"虚拟终端",以及其他变种。
比如游戏手柄一类的设备,也可以看作console。
Command line [interface]
命令行是一个界面,用户在这里输入一个命令(表现为一连串的字符--通常是一个命令名称,后面有一些参数),然后按回车键来执行该命令。
Shell
shell是用户登录时看到的主要界面,其主要目的是为了启动其他程序。(我不知道最初的比喻是shell比作用户的家庭环境,还是shell是其他程序在shell里运行)。
在unix圈子里,shell已经专门指的是命令行shell,其核心是输入想要启动的应用程序的名称,然后是该应用程序应该执行的文件或其他对象的名称,最后按回车键。其他类型的环境(最近Gnome Shell明显例外)通常不使用 "shell "这个词;例如,窗口操作系统涉及 "窗口管理器 (windows managers)"和 "桌面环境(desktop environments)",而不是 "shell"。
有许多不同的unix shells。Ubuntu的默认shell是Bash(和大多数其他Linux发行版一样)。流行的替代品包括zsh(强调功能和可定制性)和fish(强调简单性)。
命令行shell包括用于组合命令的流程控制结构。除了在交互式提示符下输入命令外,用户还可以编写脚本。最常见的shell有一个基于Bourne_shell的通用语法。当讨论 "shell编程 "时,shell几乎总是被暗示为Bourne风格的shell。一些经常用于编写脚本但缺乏高级交互功能的shell包括Korn shell(ksh)和许多ash的变种。几乎所有的类Unix系统都有一个Bourne风格的shell,作为/bin/sh安装,通常是ash、ksh或bash。在Ubuntu上,/bin/sh是Dash,一个ash的变体(选择它是因为它比bash更快,使用的内存更少)。
在unix系统管理中,用户的shell是他们登录时被调用的程序。正常的用户账户有一个命令行shell,但有限制权限的用户可能有一个受限的shell或只能执行其他一些特定的命令(例如,只用于文件传输的账户)。
Terminal vs Shell
Terminal和shell之间的分工并不完全明显。下面是它们的主要任务。
- 输入:终端将按键转换为控制序列(例如:Left → \e[D)。shell将控制序列转换为命令(例如: \e[D → backward-char)。
- 行的编辑、输入历史和自动补全是由shell提供的。
- 终端可以提供自己的行编辑、历史记录和自动补全功能,只在准备好要执行的时候将一行内容发送给shell。唯一以这种方式操作的普通终端是Emacs的M-x shell。
- 输出:shell发出指令,如 "显示foo","将前景颜色切换为绿色","将光标移到下一行",等等。终端对这些指令采取行动。
- 提示符是纯粹的shell概念。
- shell永远不会看到它所运行的命令的输出(除非被重定向)。输出历史(scrollback)纯粹是一个终端的概念。
- 应用间的复制粘贴是由终端提供的(通常用鼠标或按键序列,如Ctrl+Shift+V或Shift+Insert)。外壳可能也有自己的内部复制粘贴机制(例如Meta+W和Ctrl+Y)。
- 工作控制(job control)(在后台启动程序并管理它们)主要由shell执行。然而,是终端处理组合键,如Ctrl+C杀死前台进程,Ctrl+Z暂停工作。
参考:
What is the difference between Terminal, Console, Shell, and Command Line? - Ask Ubuntu