“终端”、“外壳”、“tty”和“控制台”之间的确切区别是什么?

Laz*_*zer 1433 shell terminal tty terminology console

我认为这些术语在松散使用时几乎指的是同一件事:

  • 终端
  • 贝壳
  • 打字机
  • 安慰

这些术语中的每一个究竟指的是什么?

Gil*_*il' 1381

终端是电线的末端,贝壳是乌龟的家,tty 是一个奇怪的缩写,控制台是一种柜子。

好吧,从词源上来说,无论如何。

在 Unix 术语中,简短的回答是

  • 终端 = tty = 文本输入/输出环境
  • 控制台 = 物理终端
  • shell = 命令行解释器

控制台、终端和 tty 密切相关。原来,他们的意思一台设备,通过它你可以与计算机交互:在UNIX的早期,这意味着一个电传式的装置类似一台打字机,有时也被称为速记一台电传打字机,或“TTY”。“终端”这个名字来自电子的角度,“控制台”这个名字来自家具的角度。在 Unix 历史的早期,电子键盘和显示器成为终端的标准。

在 unix 术语中,tty是一种特殊类型的设备文件,它实现了除读写之外的许多附加命令 ( ioctls )。就其最常见的含义而言,终端是 tty 的同义词。某些 tty 由内核代表硬件设备提供,例如来自键盘的输入和输出到文本模式屏幕,或通过串行线路传输的输入和输出。其他 tty,有时称为伪 tty,由称为终端仿真器的程序提供(通过薄内核层),例如Xterm(在X Window 系统中运行)、Screen(在程序和另一个终端之间提供一层隔离)、Ssh(将一台机器上的终端与另一台机器上的程序连接起来)、Expect(用于编写终端交互的脚本)等。

终端一词也可以具有更传统的含义,指的是一种设备,通过该设备可以与计算机(通常是键盘和显示器)进行交互。例如,X 终端是一种瘦客户端,一种专用计算机,其唯一目的是驱动键盘、显示器、鼠标和偶尔的其他人机交互外围设备,实际应用程序运行在另一台更强大的计算机上。

控制台一般是在物理意义上,是由一些定义直接连接到机器主终端的终端。控制台在操作系统中显示为(内核实现的)tty。在某些系统上,例如 Linux 和 FreeBSD,控制台显示为多个 tty(在这些 tty 之间切换的特殊组合键);只是为了混淆问题,给每个特定 tty 的名称可以是“控制台”、“虚拟控制台”、“虚拟终端”和其他变体。

另请参阅为什么虚拟终端是“虚拟的”,“真正的”终端是什么/为什么/在哪里?.


一个是主界面,用户登录时看到的,其主要目的是启动其他程序。(我不知道原来的比喻是shell是用户的家庭环境,还是shell是其他程序运行的地方。)

在 unix 圈子中,shell专门表示命令行 shell,以输入要启动的应用程序的名称为中心,然后是应用程序应操作的文件或其他对象的名称,然后按 Enter 键。其他类型的环境不使用“shell”这个词;例如,窗口系统涉及“窗口管理器”和“桌面环境”,而不是“外壳”。

有许多不同的 unix shell。用于交互式使用的流行 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。

在 unix 系统管理中,用户的shell是在他们登录时调用的程序。普通用户帐户有一个命令行 shell,但访问受限的用户可能有一个受限的 shell或一些其他特定命令(例如,用于文件传输- 仅限帐户)。


终端和外壳之间的分工并不完全明显。以下是他们的主要任务。

  • 输入:终端将键转换为控制序列(例如Left? \e[D)。Shell 将控制序列转换为命令(例如\e[D? backward-char)。
  • 行编辑、输入历史和补全由 shell 提供。
    • 终端可能会提供自己的行编辑、历史记录和完成,并且仅在准备好执行时才向外壳发送一行。以这种方式运行的唯一通用终端是M-x shell在 Emacs 中。
  • 输出:shell发出诸如“显示foo”、“将前景色切换为绿色”、“将光标移动到下一行”等指令,终端根据这些指令进行操作。
  • 提示纯粹是一个 shell 概念。
  • shell 永远不会看到它运行的命令的输出(除非重定向)。输出历史(回滚)纯粹是一个终端概念。
  • 应用程序间复制粘贴由终端提供(通常使用鼠标或按键序列,例如Ctrl+ Shift+VShift+ Insert)。外壳也可能有自己的内部复制粘贴机制(例如Meta+WCtrl+ Y)。
  • 作业控制(在后台启动程序并管理它们)主要由 shell 执行。但是,它是处理组合键的终端,例如Ctrl+终止C前台作业和Ctrl+Z挂起它。

  • 只是狡辩:我会说这两种 tty 都是由内核“提供”的。我要强调的不同之处在于硬件 ttys(例如串行线路和内置的文本模式控制台)一端连接到硬件,一端连接到软件(例如登录程序和/或 shell)而伪 ttys 有两端都连接到软件(例如,一端是终端模拟器,另一端是 shell)。 (61认同)
  • [这个](http://osr507doc.sco.com/en/OSTut/graphics/kernel.gif) 是我脑海中shell比喻的形象。 (27认同)
  • “……终端……处理组合键,比如 Ctrl+C 来终止前台工作,Ctrl+Z 来暂停它” 不完全是:终端仍然只是发送控制字符,它是 tty 设备决定如何处理它们,并且它是可配置的. 默认情况下,tty 设备将控制字符转换为发送到 shell(和其他进程)的信号。 (24认同)
  • Linux下的“控制台”还有另外一个含义。控制台(只有一个)是具有足够优先级的 `printk` 去的地方(例如,内核崩溃)。它是通过在内核命令行上传递 `console=DEVICE,...` 来设置的(例如,`console=ttyS0,115200` 用于第一个串行端口,速度为 115,200 bps)。通常它默认为虚拟终端,但可以在编译内核时更改。 (16认同)
  • @phunehehe:是的,这是操作系统设计中常用的“shell”的不同含义:shell 是内核的外部部分。这不是 Unix 术语:Unix 内核往往没有一个可以称为 shell 的组件。 (12认同)
  • 外壳确实是内核的外壳(保护或无),它处理用户<-->内核交互。shell 允许用户执行内核调用;此处主要关注以交互方式执行其他程序的能力,因为一旦您可以执行程序,您就可以运行编辑器和编译器来生成程序来处理其余的内核调用。通常,像 Nautilus 这样的文件浏览器也是 shell,虽然可能不是 **full** 对,因为它们大多不支持提供自定义参数,但它们 ** 仍然是 ** shell。 (6认同)
  • 最初,控制台(家具)放置在计算机附近,带有许多按钮、灯和开关来控制计算机。当引入终端时,(唯一的)终端在逻辑上被放置在/内置到控制台中。然后控制台的其他部分越来越少,最后只剩下终端了。因此,控制台终端(控制台中/上的终端)成为控制台的同义词。 (6认同)
  • “控制台”实际上是直接连接到实际计算机的终端(键盘+屏幕组合,虽然最初是电传打字机)。它通常在(上锁的)计算机房里,只有少数人可以访问。它也是唯一在单用户模式下工作的终端。所有其他用户,使用通过串行线连接的终端。这些天使用个人电脑;“控制台”是您 PC 的键盘和屏幕,您将直接在其上完成大部分工作。 (5认同)
  • 除了上面的评论:Unix 在设计上是一个多用户环境。通常,人们会使用瘦客户端与 unix 环境进行交互 - 键盘和监视器将通过线路向 unix 服务器发送命令。如果我没记错的话,TTY 曾经代表 TeleTYpe - 因此,使用该系统的每个用户都必须通过 tty 进行接口。这就是为什么文件系统中存在多个 tty 文件的原因;每个正在使用的电传打字机都有一个(可能没有使用)。 (3认同)
  • 一个狡辩:tty 驱动程序(通过它的熟化模式,为无尽的讽刺提供更多空间:) 处理行编辑(即,如果我写了一些东西并通过退格删除它,这是由 tty 完成的。也就是说,除非 `readline` 或一些这种新奇的东西可以处理它,tty 处于原始模式)。只有在我按 ENTER 后,shell 才会收到该行。 (3认同)
  • @confused00 提示当然是由终端显示的,但它所做的只是解释以某种颜色在某个位置显示字符的顺序。终端不知道“这是一个提示”、“这是命令输出”等,它只知道“我被要求显示这个”。 (2认同)
  • 我认为 explorer.exe 是一个 [shell for Windows](https://en.wikipedia.org/wiki/Windows_shell),就像它是一个窗口管理器或桌面环境一样。它是 Windows 中的三个 shell 之一,另外两个是 cmd.exe(命令提示符)和 powershell.exe(Windows PowerShell) (2认同)

and*_*coz 211

终端控制台是一个硬件,利用其用户可以与主机交互。基本上是一个键盘加上一个文本屏幕。
现在几乎所有的终端和控制台都代表“虚拟”的。

代表终端的文件传统上称为tty文件。如果你查看 UNIX 系统的“/dev”目录,你会发现很多tty文件连接到虚拟控制台(例如 linux 上的 tty1)、虚拟终端(例如 pts/0)或物理连接的硬件(例如 ttyS0)是连接在主机第一个串行端口上的物理串行终端(如果有)。

控制台必须是一个片物理地连接到(或部分)主机硬件的。它在系统中具有特殊的作用:它是访问系统进行维护的主要点,某些特殊操作只能从控制台完成(例如参见single user mode)。甲终端可以是并且通常是,硬件的远程部件。

最后,但并非最不重要的一点是,shell是一种特殊的程序,它通过控制 tty与用户交互并向用户提供启动其他程序(例如 bash、csh、tcsh)的方式。

终端仿真器是模拟物理终端的程序(例如xterm中,侏儒末端,小型机)。

因此,当您查看 linux 系统(在 X11 下)上的“文本窗口”时,您会看到:一个终端模拟器,连接到一个虚拟终端,由一个tty文件标识,其中运行一个shell

  • 任何台式计算机都有系统控制台(在我的 2015 年或海报的 2010 年,没关系)。正如它所说的那样,它是一个硬件。但是说“现在几乎所有......游戏机都代表“虚拟”游戏机”几乎是矛盾的,显然不好。 (2认同)
  • @IncnisMrsi - 台式电脑不是 _console_ 吗?如果没有,你说它有一个系统控制台是什么意思? (2认同)
  • @Motivated `/dev/pts/0` 是一个 tty 文件,是内核公开的编程接口的处理程序。通过这个处理程序,程序(例如外壳)可以与终端(真实的或虚拟的)交互。终端模拟器是一种模拟终端的软件。模拟器要求内核创建一个处理程序,让程序与其自身交互(参见`man openpty`)。因此信息从终端(模拟器)流向内核 tty 处理程序,再到程序(反之亦然)。程序和终端不直接相互交谈,而只能通过 tty 文件(处理程序)。 (2认同)

Joh*_*han 55

简短说明:

控制台是一个终端。一个系统有一个控制台和可能有多个终端。控制台通常是管理计算机的主要界面,例如,当它仍在启动时。

终端是一个会话,可以接收和发送命令行程序的输入和输出。控制台是其中的一个特例。

TTY 本质上是一个伪设备,称之为内核资源,进程使用它来访问特定终端。TTY 可以绑定到硬件(例如串行端口),也可以是虚拟的,例如在用户通过网络登录时创建

shell是一个用来控制和运行程序的程序。它通常通过终端交互使用。存在多种 Shell 程序,Bash 可以说是当今最常用的 Shell。其他 shell,没有特别的顺序,包括 Bourne Shell、C-shell、Dash、Tsch、Ksh 和越来越流行的 zsh。还有更多。

当您拥有 GUI 时,您可以使用终端程序为终端会话绘制漂亮的可调整大小的边框、添加滚动条和格式化文本等等。通常这些被称为终端模拟器,有时它们可​​以通过 TAB 概念处理多个会话。终端仿真器通常会启动一个 Shell,以允许您以交互方式在命令行上工作。


Pre*_*raj 45

一个TTY(即牛逼ELE TY pewriter)是一个特殊的装置,可以让人们谁是耳聋,重听或言语障碍的使用电话,让他们键入文本消息进行通信。对话的两端都需要 TTY 才能进行通信。
OR
TTY是用于输入文本消息的终端


:种子的外部保护性覆盖部分,即仁。

框架或外部结构到系统的中心或基本部分。
在此处输入图片说明


控制台是指键盘和显示器物理连接到计算机。


Inc*_*rsi 31

已经有两个很好的答案,但我想添加有关短语“虚拟终端”的信息。通常,它意味着提供终端外观/功能的东西,即 广义上的。但是在 Linux 的早期(1994-95),它被一些开发人员用作“虚拟控制台”(几个不相关的用户界面)的同义词。这种用法在文档中一直存在;两个不同的术语曾经(和现在)用来指代 tty1、tty2……东西。如今(自 1996 年以来)“虚拟终端”也可以指基于的终端仿真器。

Linux vt(文本模式系统控制台的驱动程序)是其内核的第一部分。它最初用于连接到大型机,从这个意义上说,它是一个“虚拟终端”,因此得名。控制虚拟控制台的代码也位于其中vt.c。Linux 内核工程师一贯使用“控制台”一词来表示 tty1、tty2……并使用“vc_”前缀来表示它们。例如,有一个vc_allocate函数。在另一方面,这样的用户空间工具的开发kbdconsole-tools可互换使用的“虚拟控制台”(VC)和“虚拟终端”(VT)。我已经联系过安德里斯?E。布劳威尔并要求他澄清早期开发人员(1994-95)使用的术语。安德里斯好心地提供了一些答案。他指出 VT 和 VC 是同义词和“不可分割的”缩写。

一般来说,虚拟控制台是一个虚拟终端,但反之则不然。那些不是虚拟控制台的“虚拟终端”确实是终端(正如安德里斯所说,它们不是 VT)。与内核为控制台应用程序提供终端功能的虚拟控制台不同,伪终端使用 PTY“设备”来安排控制台应用程序和在用户空间中运行的终端制作程序之间的通信。示例是基于 X 的终端模拟器和sshd,它为每个登录会话分配一个伪代码。假人可能不会被称为“控制台”?——这是一个错误。


Rak*_*kib 17

  • 终端 = 提供输出显示和输入到 shell 会话的键盘的接口。

  • Shell = 执行输入为字符串的命令的解释器

  • 控制台:实际上我们使用两种类型的控制台:

    • 物理控制台 = 用于与系统交互的硬件显示器和键盘
    • 虚拟控制台 = 多个逻辑控制台之一,每个控制台都可以支持独立的登录会话。
  • tty(电传打字机,即终端)=终端基本上只是一个用户界面设备,它使用文本输入和输出消息。


Pal*_*ndu 12

这是简短的答案-

内核- 任何现代操作系统的最内部,它直接与实际硬件对话。

Shell - 实际内核的包装器。每当我们运行命令时,我们实际上是在与 shell 对话,后者又会调用适当的内核指令。除此之外,shell 还能够执行其他一些操作,例如在有命令的同时查找合适的程序、一些文件名简写、管道命令等。

终端- 在早期计算时代,计算机(称为大型机)是巨大的。因此,拥有一个处理单元并从多个地方连接它很容易。终端是连接到主机的键盘和输出设备的实际硬件。

控制台- 直接连接到大型机用于操作系统管理的特殊类型终端。

tty - TeleTypewriter 用于向大型机发送数据和从大型机接收数据。在视频终端可用之前使用。但传统上它仍然被命名为 tty。连命令stty

详细的答案在这里 -终端、控制台、外壳、内核、命令 - 计算机的不同部分

  • @Webwoman - 我的系统配置为仅允许通过“sudo”或通过控制台登录访问“root”帐户。控制台通常在特权方面具有特殊的位置,因为有权访问它们的人必须能够物理访问与其通信的计算机。它们也是最后手段的访问方法。如果操作系统处于部分损坏的状态(例如以太网驱动程序损坏),您仍然可以访问控制台。无论系统处于什么状态,它都是一种始终可用的人机界面设备。 (2认同)

use*_*142 12

你需要深入了解历史。

有类似打字机的设备,带有纸和键盘。它们被称为电传打字机(意思是“远程打字”,因为“tele”的意思是“远程”)或简称ttys。在 70 年代,它们被称为 glass ttys 的带有 CRT 显示器的设备所淘汰。

任何计算机都需要某种方式来报告其状态和错误(并且可能接受命令)。它是通过控制台完成的,控制台几乎总是直接连接到计算机。因此,console有两种含义:用于报告状态的东西和直接连接的东西。

UNIX 是一个交互式系统:多个用户可以连接到它并启动应用程序。第一台计算机为此使用电传打字机(tty):每个用户都通过串行线路连接将电传打字机连接到机器。这种电传被称为终端。UNIX 也有特殊的子系统来处理“坐在终端后面的用户”,它也被称为tty,因为第一个终端是电传打字机。每个进程都可以连接到 Unix 中的 tty。这意味着有一个用户坐在终端附近。有关更多信息,请参阅http://www.linusakesson.net/programming/tty/

用户需要某种方式来告诉内核运行应用程序。shell(sh、bash、csh、ksh 等)用于此目的。shelltty 上运行,接受来自用户的命令并要求内核运行一些应用程序。

但是终端并不总是与机器物理连接。可能有一些应用程序“模拟”终端接受来自用户的击键并将它们发送到某处(xterm 和 ssh 是很好的例子)。内核中有一个 API,称为伪终端。所以你的tty可能真的连接到某个应用程序而不是真正的终端。Xterm 使用 X11 显示文本,ssh 使用网络连接。

IBM PC 有键盘和显卡(有时也称为控制台)。Linux 可以用它做不同的事情:

  • 将其用作“报告错误和状态的引擎”:Linux 控制台。如果您将 console=/dev/ttyS0 传递给内核,它将使用连接到 COM1 的东西作为控制台,如果不这样做,它将使用 PC 控制台。
  • 用它来模拟终端,即所谓的虚拟终端(vty)。

它也可能会停止在控制台上模拟终端并将其提供给某些应用程序。应用程序可能会切换其视频模式并专门使用它(X11 或 svgalib 可能会这样做)。

所以,这里有现代意义:

  • 终端:真实用户坐在它后面的东西。可能是物理终端(罕见)或伪终端(xterm、ssh)或虚拟终端(Linux 中的 vty)
  • shell:帮助用户与系统交互的应用程序(bash、tcsh 等)。
  • tty:支持终端的终端或内核子系统。
  • 控制台:报告状态和错误的东西 ( /dev/console) 或连接到计算机的物理键盘和视频显示器。


Nis*_*ant 6

除了接受的答案和TTY 揭秘文章之外,我真的很喜欢阅读这些文章:

是基于 NetBSD 的。

回到 Unix 的石器时代,计算机系统由一个大型机、一个装有内存、海量存储和计算单元的闪烁灯的大盒子组成,并运行由用户或操作员启动的进程。由于硬件非常昂贵,系统被用作真正的多用户系统,许多人同时与系统交互。它通常没有——与今天的 Unix 工作站不同——是一个固定的显示器和键盘。相反,向机器发出命令和检索输出是通过串行线路完成的,首先使用电传打字机,然后使用 CRT(阴极射线管)终端。电传打字机——这就是 Unix 中的“ttys”的来源——是电子打字机,将通过串行线路按下的按键发送到主机,

这个是基于Linux的。

终端是提供增强的输入/输出功能的设备,超出了仅使用常规文件、管道和套接字所能实现的功能。这些功能旨在使人类更容易与计算机交互,而对于试图相互交谈的程序则毫无用处。

这个是基于Linux的。

一般来说,终端是一种相对笨拙的机电设备,具有输入接口(如键盘)和输出接口(如显示器或纸张)。

还有一个由 Brian Will 在 YouTube 上制作的关于终端和外壳的介绍性播放列表。


Omn*_*ous 6

让我来分析一下……我将在这方面或多或少地将 Unix 和 Linux 用作同义词。如果我指的是早于 Linux 存在的历史事物,我通常会写“Unix”,如果我谈论的是更近的事物,或者特定于 Linux 风格的 Unix,我通常会写“Linux ”。

贝壳

您列表中唯一与其他概念没有重叠的离散概念是“外壳”。shell 是一个程序,其目的是与用户进行通信并代表他们执行操作系统操作。

最常见的 shell 使用一种称为“命令行”的技术,它包括向用户发送某种提示,等待用户输入文本命令,然后执行该命令。但是有基于菜单的 shell,甚至图形 shell(如 Windows 文件资源管理器),尽管没有自尊的 Unix 人会称这样的东西为“shell”。

在 Unix 中,如果有人将某些东西称为“shell”,那么他们几乎肯定是指某种形式的命令行界面,正如我刚刚描述的那样。在 Unix 世界中,如果不使用我进一步描述的 tty 模型与用户通信,那么将任何东西称为“shell”是非常奇怪的。

打字机

这是一个令人困惑的问题,因为它可以指代几种不同的事物。

在 Linux 中,有一种称为“tty”的设备。它是一种抽象设备,可用于与用户或以某种方式从用户获取输入的事物进行双向通信。有时,该抽象设备可能直接对应于某个物理设备。有时它可能是一个程序,它向某人显示一个窗口,在该窗口中出现通信并且用户可以在其中键入。

但是,这个抽象设备存在的原因以及它被称为“tty”的原因是“tty”是“电传打字机”的缩写,它是一种实际的物理设备,具有打印在纸上的打印机和键盘。抽象的“tty”设备呈现给正在使用它的程序的模型基本上是另一端有一个电传打字机。你给它发送字符,这些字符会出现在电传打字机上。当你从中读取字符,这些字符代表了输入键盘上的键。

旧的基于纸张打印机的 ttys 很快被视频 ttys 取代。当然,在那些上,没有纸卷。而且,事实上,可以覆盖屏幕上的任何字符。但是,不是向程序提供某种抽象的“屏幕”界面,而是期望程序发送称为转义序列的特殊字符流,以完成各种任务。通常有一个抽象的东西叫做“光标”,它可以在屏幕上移动,发送的任何字符都将替换光标处的任何内容,光标将进一步移动一个字符。通常,您也可以更改即将使用转义序列打印的字符的颜色。

有一些不遵循此模型的“玻璃 tty”,因此在 Unix 世界中处理得不好。IBM 3270 系列视频终端属于这一类。

Linux/Unix 人们通常所说的“shell 窗口”是使用图形用户界面对玻璃 tty 的模拟。在内部,在 shell 窗口内运行的程序正在与虚拟 tty 设备对话,该设备有时称为伪 tty 或伪终端(又名 pty)。

终端

终端只是计算机和人应该进行交互的地方。终端可能是完全图形化的,并且不会以任何方式遵循 tty 模型,即使程序可能会使用它们的功能来模拟这一点。所有实际的物理 tty(玻璃或其他)都是终端。

安慰

控制台是一种特殊的终端,通常应该以某种直接安全的方式连接到运行操作系统的硬件。

在 Linux 中,控制台以一种小的方式虚拟化,允许您使用特殊的按键在虚拟控制台之间切换。但是这种虚拟化是通过内核中的软件使用真正的硬件完成的。

有很多方法可以通过所谓的“串行控制台”来使用 Linux,这是一个通过串行端口(如 USB 端口)连接到计算机的控制台(或者,在一些非常小的和/或非常旧的计算机上,一个 RS-232 端口某种形式)并以相当严格的方式遵循旧的电传打字机模型。

同样,这个想法是这个控制台以直接物理方式连接到计算机,而不是通过某种可能允许任何人连接的网络。