终端、控制台、Shell 和命令行有什么区别?

Ano*_*non 274 command-line terminology console

终端、控制台、Shell 和命令行有什么区别?

Gil*_*il' 186

简短的回答:

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

长答案:

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

终端

在 unix 术语中,终端是一种特殊类型的设备文件,它实现了除读写之外的许多附加命令 ( ioctls )。某些终端由内核代表硬件设备提供,例如来自键盘的输入和输出到文本模式屏幕,或通过串行线路传输的输入和输出。其他终端,有时称为伪终端或伪 tty,由称为终端仿真器的程序提供(通过薄内核层)。一些类型的终端模拟器包括:

  • 在X Window 系统中运行的 GUI 应用程序:Xterm、Gnome Terminal、Konsole、Terminator 等。
  • Screen和tmux,它在程序和另一个终端之间提供了一层隔离
  • ssh,将一台机器上的终端与另一台机器上的程序连接起来
  • Expect,用于编写终端交互脚本

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

安慰

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

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

命令行 [界面]

甲命令行是用户类型的命令的接口(其表达为字符序列-通常是一个命令的名称,随后由一些参数)并按压Return来执行命令键。

贝壳

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

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

有许多不同的 unix shell。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或一些其他特定命令(例如,用于文件传输- 仅限帐户)。


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

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

从Unix 和 Linux回收

  • @PeterCordes 在内核配置中,可以省略对终端的支持(这对于一些内存非常紧张的罕见嵌入式系统很有用);它由`CONFIG_TTY`控制。对终端模拟器(更恰当地称为伪终端——“终端模拟器”并不总是包括 telnetd、screen、expect 等)的支持由`CONFIG_UNIX98_PTYS` 控制。对PC文本模式显示和键盘等的支持由`CONFIG_VT`控制。请参阅内核源代码中的 [`drivers/tty/Kconfig`](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/tty/Kconfig)。 (3认同)
  • @PeterCordes 在这个细节级别上,没有区别。[POSIX](http://pubs.opengroup.org/onlinepubs/007904875/basedefs/xbd_chap03.html#tag_03_390) 在设备文件的意义上将 *terminal* 定义为 *terminal device* 的同义词。这就是Unix的意思。它恰好是处理转义码,将按键转换为字符并在屏幕上绘制(或通过网络传输,或记录到文件等)的东西。 (2认同)
  • 人力资源部,是的,终端也确实在这个意义上被使用了。假设在内核正在处理的终端设备的一端有一个终端仿真器或一个连接有终端设备的串行端口。内核 tty 处理(在熟模式下)只处理一些控制代码(^c 上的信号,^u / ^? 上的行编辑?(删除)。我试图在 tty 代码和 Linux 部分之间划一条线它在显卡和 USB/ps2/AT 键盘上实现了类似 VT100 的终端。没有它你可以编译 Linux,但没有 tty 就不行。 (2认同)
  • 糟糕,我没有最近的内核源代码。CONFIG_TTY 是在 2012 年才添加的。无论如何,是的,希望这可以帮助任何人试图将他们的头脑围绕在拼图的不同部分是什么,以及它们如何组合在一起。 (2认同)

Ano*_*non 82

一种视觉表现。

终端

你可以坐下来,像老板一样工作。

终端

安慰

一些硬件可以做很多事情。

安慰

控制台的另一个示例是视频游戏控制台,例如 Super Nintendo [您可以在其中玩 Actraiser]

贝壳

基本上是一个运行命令的应用程序。

贝壳贝壳

命令行 [界面]

基本上任何你输入命令的东西。

命令行界面命令行界面

  • 你偷了我的想法 - 我将给出基本相同的答案。所以你可以投赞成票。重点当然是,虽然这些术语如今大多是同义词,但诸如“终端”和“控制台”之类的术语起源于较旧的计算概念。 (14认同)
  • 好功夫。简单易行 (3认同)

rɑː*_*dʒɑ 21

来自Linux 信息项目:

终端:从技术上讲,终端窗口,也称为终端模拟器,是模拟控制台的图形用户界面 (GUI) 中的纯文本窗口。

用我们的话来说,一个 GUI 应用程序,我们可以从那里访问用户的控制台。

控制台:包含计算机控件的仪表板

Shell:Shell 是一种程序,可为 Linux 和其他类 Unix 操作系统提供传统的纯文本用户界面

命令行:命令行是计算机显示器(通常是 CRT 或 LCD 面板)上的全文本显示模式下命令提示符右侧的空间,用户可以在其中输入命令和数据

  • “终端”代表纯物理文本屏幕。你说的其实是“终端模拟器”。 (6认同)
  • @AgentCool 我不怀疑您复制粘贴的能力。我质疑你选择的来源。无论您是否撰写,您发布的内容都是您的责任。 (5认同)
  • @RegisteredUser 终端模拟器是一种终端。*terminal* 一词不仅限于物理终端(通常的词是 *console*)。 (2认同)
  • *命令行*的这个定义是错误的。命令行不限于全文本显示模式。 (2认同)

nux*_*nux 19

所述外壳是一个程序,它处理命令和返回输出,象击在Linux中。

一个终端是运行一个程序外壳。过去它是一个物理设备(在终端是带键盘的显示器之前,它们是电传打字机),然后它的概念被转移到软件中,比如 GNOME 终端。

因此,当我打开 GNOME 终端时,会出现一个运行Shell的黑色窗口,以便我可以运行我的命令。

一个控制台是一个终端特殊排序。它也是一个物理设备。例如在Linux中,我们有虚拟控制台,我们可以通过组合访问Ctrl+ Alt+F1到F7。

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


Pit*_*kos 18

这里的答案似乎非常好。然而,它们对我的口味来说太干燥和技术性,所以我会试一试。

终端是某事的结束——它终止的地方。例如,如果您在某个城市乘坐地铁,您下车的车站就是您的终点站。或者在机场,人们到达目的地国家后出来的地方被认为是航站楼。如今,机场航站楼既是人们登机的地方,也是人们下飞机的地方,这是出于明显的经济原因。

计算机的目的是获取数据,用它做一些事情,然后吐出结果。因此,终端是您可以从中获得计算结果的任何设备(例如屏幕)。碰巧的是,在最初的计算机中,您通常将输入(键盘)和输出(屏幕)作为一个设备。因此,如今终端被视为任何输入/输出设备。鼠标、键盘、屏幕、摄像头,都是终端。

Shell是操作系统的东西。在计算机上,您拥有内核,例如在 Ubuntu 上是 Linux 部分。现在由于内核确实是低级的,所以提供了一个外壳程序——一个让用户以一种简单的方式与内核交互的程序。例如,这就是 BASH。

控制台是(来自字典)

包含机器、电气设备等控件的平面。

这就是为什么在音乐行业中带有所有旋钮的板子,或者在航天飞机中的指挥台,它们都被认为是控制台。Super Nintendo 和 PS2 在历史上也被称为控制台,因为第一个这样的娱乐设备看起来就像上面有一堆按钮的盒子。

命令行只是一个界面 - 与 GUI 相反。即计算机上有两种类型的接口;CLI(命令行界面)和 GUI(图形用户界面)。主要区别在于第一个从键盘输入,第二个从鼠标输入。

  • “GUI 的对立面”是什么意思? (2认同)
  • 相反,我的意思是你有 CLI 或 GUI。我现在在答案中澄清了一点。 (2认同)

Pet*_*des 11

这些术语经常一起使用,因此人们使用其中一个术语来指代该集合。(即,从上下文中可以明显看出,它们是指提供命令行 shell 接口的终端窗口)。

为了避免冗长,我只想说 xterm 作为 XTerm / Gnome Terminal / Konsole / mrxvt / etc / 等的替代品。 bash 也是如此。

Console有多种其他特定含义,所以暂时不要考虑它。

终端:通过 ASCII / UTF8 / 其他字符的双向流提供与程序的人机交互的东西,通常使用 VT100 或类似的转义码处理。(例如退格、删除、箭头键等生成转义码。程序可以打印转义码以在终端屏幕周围移动光标、切换到粗体文本和/或颜色、清除或滚动屏幕等)。过去,这通常是带有屏幕、键盘和串行端口的专用设备。现在,它通常是一个像 xterm 这样的程序。

有用于程序从/向终端读取/写入的设备文件,虚拟终端也可以作为设备文件访问另一端。这是 xterm 写入您的输入以便 bash 可以读取它的地方。

每个终端,包括虚拟终端,在熟(而不是原始)模式下都提供基本的行编辑。这是由内核代码处理的。bash 提供了可以使用箭头键进行的行编辑。(cat如果您想查看内核提供的基本行编辑是什么样的,请尝试运行和输入。退格键有效,以及根据您的 stty 设置进行的其他一些操作。)

尽管终端设备背后有很多内核代码,但它被称为终端处理代码,而不是终端本身。

编辑:Gilles 说服我将 tty 称为终端是正确的用法。终端仿真器和连接到终端运行的交互式程序都依赖于内核实现的终端语义。(大多数这种行为是由 POSIX 标准化的,并且在 Linux/*BSD/其他 Unix 上是相同的。)全屏文本编辑器取决于 Unix tty 内容的行为以及光标移动转义码处理,以及终端模拟器的许多其他功能。

但是,带有屏幕、键盘和串口的物理 VT100 是终端的一个实例。它不需要在其串行端口的另一端安装 Unix 内核即可完成。完全不同的事情可能是向它发送转义码和 ASCII 文本,并从中接收相同的内容。不过,它只是一个 VT100,而不是 Unix 终端。终端模拟器加上 Unix tty 语义构成了 Unix 终端的完整包,像 bash 这样的程序通常在上面运行。

命令行是一种用户界面样式,您可以在其中键入内容,然后按回车键使某些事情发生。它也被用作命令行 shell 的简写,比如 bash 或 MS-DOS,但你也可以说“它是一个命令行工具”,比如 fdisk。仅考虑使用终端作为其 UI 的程序,两个主要系列是命令行和全屏文本(例如 vi 或 之类的编辑器emacs -nw)。

通常在终端上运行的命令行程序几乎总是在其输入和输出重定向到文件的情况下工作,但基于终端的全屏程序(如编辑器或电子邮件客户端)仅用于交互,无法运行。

一个外壳是启动其他程序的程序。在 Unix 环境中,通常指的是命令行 shell(即 Bourne shell 或 C shell 等价物)。Unix shell 也可以从文件中读取它们的输入,即 shell 脚本。它们是完整的编程语言,具有变量、循环和条件,并且许多程序是用 bash 编写的(或仅具有/bin/shPOSIX shell 功能,以提高可移植性)。for i in *.something; do some_program "$i";done 在交互式 shell 中编写快速程序也很容易 。

综上所述,/dev/pts/N在 xterm 将您的输入写入伪终端的一侧后,像 bash 这样的 shell(或您通过运行 shell 命令启动的任何程序)将从终端设备接收字符。如果您运行cat,然后点击^c,内核 tty 代码将作用于^c并将 a 发送SIGINT到该终端上的前台进程。(注意终端的使用在这种情况下是指 Unix tty,而不是终端模拟器或连接到串行端口的东西。)发生这种情况是因为 shell 在启动任何程序之前将终端置于“cooked”模式,这意味着内核对某些控制进行操作-序列。(tty 代码仍然与处理 VT100 转义码无关,只是一些低 ASCII 控制代码。)如果您使用的是 Linux 控制台文本终端而不是 xterm,那么内核正在执行 VT100 仿真,并且处理所有这些东西。Linux 可以在没有虚拟控制台文本终端支持的情况下编译,但不能没有 tty 支持。

控制台有时用作终端的同义词(KDE 甚至有一个名为 Konsole 的终端模拟器)。

正如 0xSheepdog 所指出的,它还有另一个含义:本地附加的人机交互硬件。

在内核上下文中,控制台具有另一个特定含义:它是写入引导消息的终端。这可以是串行端口。通常,当然,它是由内核在图形硬件和 USB/ps2/AT 键盘的驱动程序之上实现的文本控制台。如果您使用console=tty0 console=ttyS0,115200n8命令行启动 Linux ,您将在屏幕和串行端口上看到内核消息。

Linux 实现了虚拟控制台(/dev/tty1到N)。你可以换哪一个物理屏幕/键盘与控制Ctrl+ Alt+ 。典型的 Linux 发行版创建 6 个,然后从所有发行版开始,因此即使您不能或不想启动 X11,您也可以登录 6 次并在命令、手册页和其他任何内容之间切换,而无需运行像 screen 这样的程序。Linux(内核)包括一个 VT100 风格的终端模拟器,通过虚拟控制台上的屏幕和键盘提供终端界面。FNgetty

与登录提示标准的6个虚拟终端是为什么Ctrl+ Alt+F7让你回到你的X11会话:X服务器抓住下一个可用的虚拟控制台。(不过,X 服务器/dev/input/...直接打开,而不是从 获取您的按键/dev/tty7。)

所以“切换到文本控制台”意味着按Ctrl+ Alt+F1并使用该终端。回到计算机速度慢且没有多少内存的时候,有些人将大部分时间花在文本控制台上,因为它们速度快,您可以设置漂亮的字体,甚至将终端大小更改为较小的字符,但是立即在屏幕上显示更多内容。 Alt+Left和Alt+Right交换到上一个/下一个控制台。(X11禁用此为它的控制台,当然,只留下Ctrl+ Alt+的组合。)FN

因此,控制台是这些术语中唯一一个没有明确定义的技术含义的术语。它有几个不同的。(根据您对终端本身与终端加上 tty 处理的看法,您可以说终端也有多种含义。)

  • *控制台*意味着“主要”物理终端不仅在内核上下文中。在 [`/dev/console`](http://pubs.opengroup.org/onlinepubs /007904875/basedefs/xbd_chap10.html#tag_10_01)。*Console* 并不是特别含糊不清——尽管它偶尔被用于 *terminal* 的更一般意义上,但这种情况非常罕见(比 *terminal* 更罕见地用于专门表示控制台)。 (2认同)

小智 7

我认为在分时计算机的早期,每个用户都有一个终端(当他们可以得到一个时!),但只有系统操作员有一个控制台。控制台可用于诸如重新启动机器或获取用户终端无法实现的系统诊断等任务。控制台位于机房内,是计算机的固有部分,而终端可以是远程的。控制台还将包括硬件灯和开关,而不仅仅是文本输入和输出。

我会说命令行是用户可以键入命令的区域,而 shell 是解释/遵守该命令的程序。术语“shell”对于 Unix 衍生产品非常特殊。“命令行”更多地是在 Windows/DOS 传统中。大型机上的等价物通常称为“作业控制语言”。

显然,随着技术的变化,这些最初的区别随着时间的推移变得模糊。