CLI、终端 (Terminal)、Shell、TTY、Console、Bash都是什么?

  • terminal = tty = text input/output environment
  • console = physical terminal
  • shell = command line interpreter
  • cli = command line interface 命令行界面
  • 命令行界面 (CLI) = 使用文本命令进行交互的用户界面
  • 终端 (Terminal) = TTY = 文本输入/输出环境
  • 控制台 (Console) = 一种特殊的终端
  • Shell = 命令行解释器,执行用户输入的命令并返回结果

shell是一个程序,可以称之为壳程序,用于用户与操作系统进行交互。用来区别与核,相当于是一个命令解析器,Shell有很多中,这里列出其中几种
- Bourne SHell(sh)
- Bourne Again SHell(bash)
- C SHell(csh)
- KornSHell(ksh)
- zsh

各个shell的功能都差不太多,在某些语法的下达下面有些区别,Linux预设就是bash。


1、终端(terminal)

终端(termimal)= tty(Teletypewriter, 电传打印机),作用是提供一个命令的输入输出环境,在linux下使用组合键ctrl+alt+T打开的就是终端,可以认为terminal和tty是同义词。

2、shell

shell是一个命令行解释器,是linux内核的一个外壳,负责外界与linux内核的交互。shell接收用户或者其他应用程序的命令, 然后将这些命令转化成内核能理解的语言并传给内核, 内核执行命令完成后将结果返回给用户或者应用程序。当你打开一个terminal时,操作系统会将terminal和shell关联起来,当我们在terminal中输入命令后,shell就负责解释命令。

3、console

在计算机发展的早期,计算机的外表上通常会存在一个面板,面板包含很多按钮和指示灯,可以通过面板来对计算机进行底层的管理,也可以通过指示灯来得知计算机的运行状态,这个面板就叫console。在现代计算机上,在电脑开机时(比如ubuntu)屏幕上会打印出一些日志信息,但在系统启动完成之前,terminal不能连接到主机上,所以为了记录主机的重要日志(比如开关机日志,重要应用程序的日志),系统中就多了一个名为console的设备,这些日志信息就是显示在console上。一台电脑有且只有一个console,但可以有多个terminal。举个例子,电视机上的某个区域一般都会有一些按钮,比如开机,调音量等,这个区域就可以当做console,且这个区域在电视上只有一个,遥控器就可以类比成terminal,terminal可以有多个。

4、bash

linux系统上可以包含多种不同的shell(可以使用命令 cat /etc/shells 查看),比较常见的有Bourne shell (sh)、C shell (csh) 和 Korn shell (ksh),三种shell 都有它们的优点和缺点。Bourne shell 的作者是 Steven Bourne,它是 UNIX 最初使用的shell 并且在每种 UNIX 上都可以使用。bash的全称叫做Bourne Again shell,从名字上可以看出bash是Bourne shell的扩展,bash 与 Bourne shell 完全向后兼容,并且在 Bourne shell 的基础上增加和增强了很多特性,如命令补全、命令编辑和命令历史表等功能,它还包含了很多 C shell 和 Korn shell 中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。总而言之,bash是shell的一种,是增强的shell。

  • 命令行界面 (CLI) = 使用文本命令进行交互的用户界面
  • 终端 (Terminal) = TTY = 文本输入/输出环境
  • 控制台 (Console) = 一种特殊的终端
  • Shell = 命令行解释器,执行用户输入的命令并返回结果

命令行界面(英语:Command-line Interface,缩写:CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。

—— 摘自 Wikipedia

在图形用户界面 (GUI) 已经完全普及的今天,普通用户在日常使用电脑的过程中几乎不用手动输入任何命令,大部分操作都是点点鼠标就能完成,而熟练使用命令行操作似乎已经成为高逼格的代名词。

但事实上,现在依然有着很多的软件开发者、系统管理员,或者是高级用户在使用命令行界面操作计算机。其中很大一个原因,就是效率:在熟记命令的前提下,使用命令行界面往往要比使用图形用户界面来得快。

举个栗子,我要把当前目录下的(包括嵌套的子目录)所有 *.tpl 文件的后缀名修改为 *.blade.php,如果不使用命令行,该怎么做?手动修改肯定不至于,但也得去网上找找相关软件,得要注意下载来源是否靠谱(像我这样有点洁癖的选手还得去找绿色版),下载后还要手动指定文件路径、重命名模板……

而使用命令行的话(这里以 Ubuntu 上的 Bash 为例),只需运行这么一句:

rename 's/\.tpl$/\.blade.php/' ./**/*.tpl

命令行操作的高效率等优点,也是现在许多图形化的计算机系统依然没有放弃提供命令行操作方式的原因。就连 Windows 都有自带 cmd.exe 和 PowerShell 等命令行程序(事实上你在搜索「批量重命名」时,可以看到很多方案都是通过「Windows 命令提示符」实现的)。

终端 (Terminal),其词汇本身的意义为「终点站;末端;(电路)的端子,线接头」。而在计算机领域,终端则是一种用来让用户输入数据至计算机,以及显示其计算结果的机器。

也就是说,终端只是一种用于与计算机进行交互的输入输出设备,其本身并不提供运算处理功能。

想要充分理解终端,我们得回溯历史,去看看终端的起源。

在大型机 (Mainframe) 和小型机 (Minicomputer) 的时代里,计算机曾经非常昂贵且巨大,不像现在这样人手一台。这些笨重的计算机通常被安置在单独的房间内,而操作计算机的人们坐在另外的房间里,通过某些设备与计算机进行交互。这种设备就叫做 终端 (Terminal),也叫终端机。

上面我们说过,在历史上,终端是连接到计算机上的一种带输入输出功能的外设。但是有一个终端与众不同,它与计算机主机是一体的,是计算机的一个组成部分。这个特殊的终端就叫做 控制台(Console)。

顾名思义,控制台是用于管理主机的,只能给系统管理员使用,有着比普通终端更大的权限。一台计算机上一般只有一个控制台,但是可以连接很多个终端。

放在现在我们可能难以理解为什么会有控制台和终端的区分,不过就像上一节所说的,当时都是很多个用户通过终端去访问一台计算机,而专门管理那些大块头机器的系统管理员另有其人。普通用户用的就是普通的终端,而系统管理员用的终端比较牛逼,所以就被叫做控制台啦(笑)。

不过随着个人计算机的普及,控制台 (Console) 与终端 (Terminal) 的概念已经逐渐模糊。在现代,我们的键盘与显示器既可以认为是控制台,也可以认为是普通的终端。当你在管理系统时,它们是控制台;当你在做一般的工作时(浏览网页、编辑文档等),它们就是终端。我们自己既是一般用户,也是系统管理员。

因此,现在 Console 与 Terminal 基本被看作是同义词。

终端也有不同的种类。

字符终端 (Character Terminal) 也叫文本终端 (Text Terminal),是只能接收和显示文本信息的终端。早期的终端全部是字符终端。字符终端也分为 哑终端 (Dumb Terminal) 和所谓的 智能终端(Intelligent Terminal),因为后者可以理解转义序列、定位光标和显示位置,比较聪明,而哑终端不行。

终端模拟器 (Terminal Emulator)

随着计算机的进化,我们已经见不到专门的终端硬件了,取而代之的则是键盘与显示器。

但是没有了终端,我们要怎么与那些传统的、不兼容图形接口的命令行程序(比如说 GNU 工具集里的大部分命令)交互呢?这些程序并不能直接读取我们的键盘输入,也没办法把计算结果显示在我们的显示器上……(图形界面的原理我这里就不多说了,它们编程的时候图形接口还在娘胎里呢!)

这时候我们就需要一个程序来模拟传统终端的行为,即 终端模拟器 (Terminal Emulator)。

严格来讲,Terminal Emulator 的译名应该是「终端仿真器」。

对于那些命令行 (CLI) 程序,终端模拟器会「假装」成一个传统终端设备;而对于现代的图形接口,终端模拟器会「假装」成一个 GUI 程序。一个终端模拟器的标准工作流程是这样的:

  1. 捕获你的键盘输入;
  2. 将输入发送给命令行程序(程序会认为这是从一个真正的终端设备输入的);
  3. 拿到命令行程序的输出结果(STDOUT 以及 STDERR);
  4. 调用图形接口(比如 X11),将输出结果渲染至显示器。

终端模拟器有很多,这里就举几个经典的例子:

  • GNU/Linux:gnome-terminal、Konsole;
  • macOS:Terminal.app、iTerm2;
  • Windows:Win32 控制台、ConEmu 等。

大部分终端模拟器都是在图形用户界面 (GUI) 中运行的,但是也有例外。

比如在 GNU/Linux 操作系统中,按下 Ctrl + Alt + F1,F2…F6 等组合键可以切换出好几个黑不溜秋的全屏终端界面,而按下 Ctrl + Alt + F7 才是切换回图形界面。不过不要被它们唬着了,虽然它们并不运行在图形界面中,但其实它们也是终端模拟器的一种。

简单来说,tty 就是终端的统称。

为什么呢?看了上面的的同学应该知道,最早的 Unix 终端是 ASR-33 电传打字机。而电传打字机 (Teletype / Teletypewriter) 的英文缩写就是 tty,即 tty 这个名称的来源。

由于 Unix 被设计为一个多用户操作系统,所以人们会在计算机上连接多个终端(在当时,这些终端全都是电传打字机)。Unix 系统为了支持这些电传打字机,就设计了名为 tty 的子系统(没错,因为当时的终端全都是 tty,所以这个系统也被命名为了 tty,就是这么简单粗暴),将具体的硬件设备抽象为操作系统内部位于 /dev/tty* 的设备文件。

为什么要把电传打字机这个硬件设备抽象成「tty 设备」文件呢?有兴趣的同学可以去了解一下 Unix 操作系统中 Everything is a file 的概念。

随着计算机的发展,终端设备已经不再限制于电传打字机,但是 tty 这个名称还是就这么留了下来。久而久之,它们的概念就混淆在了一起。所以在现代,tty 设备就是终端设备,终端设备就是 tty 设备,无需区分。

由于早期计算机上的 串行端口 (Serial Port) 最大的用途就是连接终端设备,所以当时的 Unix 会把串口上的设备也同样抽象为 tty 设备(位于 /dev/ttyS*)。因此,现在人们也经常将串口设备称呼为 tty 设备。

Shell —— 提供用户界面的程序

大家都知道,操作系统有一个叫做内核 (Kernel) 的东西,它管理着整台计算机的硬件,是现代操作系统中最基本的部分。但是,内核处于系统的底层,是不能让普通用户随意操作的,不然一个不小心系统就崩溃啦!

但我们总还是要让用户操作系统的,怎么办呢?这就需要一个专门的程序,它接受用户输入的命令,然后帮我们与内核沟通,最后让内核完成我们的任务。这个提供用户界面的程序被叫做 Shell (壳层)。

其实 Shell 只是提供了一个用户操作系统的入口,我们一般是通过 Shell 去调用其他各种各样的应用程序,最后来达成我们的目的。比如说我们想要知道一个文件的内容,我们会在 Shell 中输入命令 cat foo.txt,然后 Shell 会帮我们运行 cat 这个程序,cat 再去调用内核提供的 open 等系统调用来获取文件的内容。虽然并不是 Shell 直接去与内核交互,但广义上可以认为是 Shell 提供了与内核交互的用户界面。

至于为什么叫做 Shell,看下图就知道啦。是不是很像一层壳呢?

Shell 通常可以分为两种:命令行 Shell 与 图形 Shell。顾名思义,前者提供一个命令行界面 (CLI),后者提供一个图形用户界面 (GUI)。Windows 下的 explorer.exe 就是一个典型的图形 Shell(没错,它确实是,因为它接受来自你的指令,并且会帮你与内核交互完成你的指令)。

常见或历史上知名的命令行 Shell 有:

  • 适用于 Unix 及类 Unix 系统:

    • sh (Bourne shell),最经典的 Unix shell;
    • bash (Bourne-Again shell),目前绝大多数 Linux 发行版的默认 shell;
    • zsh (Z shell),我个人最喜欢的 shell;
    • fish (Friendly interactive shell),专注于易用性与友好用户体验的 shell;
  • Windows 下的 cmd.exe (命令提示符) 与 PowerShell。

还有其他各种五花八门的 Shell 程序,这里就不一一列举了,有兴趣的自己去搜一搜吧。

现在我们知道,终端干的活儿是从用户这里接收输入(键盘、鼠标等输入设备),扔给 Shell,然后把 Shell 返回的结果展示给用户(比如通过显示器)。而 Shell 干的活儿是从终端那里拿到用户输入的命令,解析后交给操作系统内核去执行,并把执行结果返回给终端。

不过 Shell 与终端的分工有一些容易混淆的地方,这里以例子进行说明:

  • 终端将用户的键盘输入转换为控制序列(除了字符以外的按键,比如 左方向键 → ^[[D),Shell 则解析并执行收到的控制序列(比如 ^[[D → 将光标向左移动);
  • 不过也有例外,比如终端在接收到 Ctrl + C 组合键时,不会把这个按键转发给当前的程序,而是会发送一个 SIGINT 信号(默认情况下,这会导致进程终止)。其他类似的特殊组合键有 Ctrl-Z 与 Ctrl-\ 等,可以通过 stty -a 命令查看当前终端的设置。
  • Shell 发出类似「把前景色改为红色(控制序列为 \033[31m)」「显示 foo」等指令;
  • 终端接收这些指令,并且照着 Shell 说的做,于是你就看到了终端上输出了一行红色的 foo。
  • 除非被重定向,否则 Shell 永远不会知道它所执行命令的输出结果。我们可以在终端窗口中上下翻页查看过去的输出内容,这完全是终端提供的 feature,与 Shell 没有半毛钱关系;
  • 命令提示符 (Prompt) 是一个完全的 Shell 概念,与终端无关;
  • 行编辑、输入历史与自动补全等功能是由 Shell 提供的(比如 fish 这个 Shell 就有着很好用的历史命令与命令自动补全功能)。不过终端也能自己实现这些功能,比如说 XShell 这个终端模拟器就可以在本地写完一行命令,然后整条发送给远程服务器中的 Shell(在连接状况不佳时很有用,不然打个字都要卡半天);
  • 终端中的复制粘贴功能(Shift + Insert 或者鼠标右键等)基本上都是由终端提供的。举个例子,Windows 默认的终端对于复制粘贴的支持很屎,而换一个终端(例如 ConEmu)后就可以很好地支持复制粘贴。不过 Shell 以及其他命令行程序也可以提供自己的复制粘贴机制(例如 vim)。

参考:What Is The Difference Between Shell, Console, Terminal and a "tty"?

参考:终端(terminal)、tty、shell、控制台(console)、bash之间的区别与联系

参考:知乎+终端、Shell、tty 和控制台(console)有什么区别?

参考:命令行界面 (CLI)、终端 (Terminal)、Shell、TTY的区别

参考:命令行界面 (CLI)、终端 (Terminal)、Shell、TTY,傻傻分不清楚?

CLI、终端 (Terminal)、Shell、TTY、Console、Bash都是什么?相关推荐

  1. 终端(terminal)、tty、shell、控制台(console)、bash之间的区别与联系

    1.终端(terminal) 终端(termimal)= tty(Teletypewriter, 电传打印机),作用是提供一个命令的输入输出环境,在linux下使用组合键ctrl+alt+T打开的就是 ...

  2. linux(ubuntu)~终端(terminal)shell操作指令

    shell是指计算机操作指令,是用户.计算机程序.内核之间沟通的桥梁,是计算机图形化之前操作计算机的方式,现在包含:sh-shell.bash-shell.csh-shell.tcsh-shell.a ...

  3. console、tty、pts、pty、Terminal、Physical console、Virtual console、Pseudo Terminal关系解析...

    前言: 为什么想到写这个话题,其实源于客户在排查用户登录,问到与用户登录相关的tty格式?有哪些,有什么区别?原以为10多年小机系统管理经验,回答应该so easy,突然发现解释起来有点乱,所以梳理了 ...

  4. shell不允许输入空字符_Linux Cygwin知识库(一):一文搞清控制台、终端、shell概念...

    本文共6100余字,预计阅读时间16分钟,本文知乎连接:Linux Cygwin知识库(一):一文搞清控制台.终端.shell概念,本文同步发布于微信公众号(伪码人). 关注账号学习了解更多Cygwi ...

  5. 终端、控制台、虚拟终端、伪终端的概念,阐述终端与shell的关系

    1.终端就是处理计算机主机输入输出的一套设备,它用来显示主机运算的输出,并且接受主机要求的输入,典型的终端包括显示器键盘套件,打印机打字机套件等. 终端又分为:本地终端.用串口连接的远程终端.用TCP ...

  6. linux里怎么看终端类型,如何区分Linux下的几种终端类型:tty、pty和pts

    如何区分Linux下的几种终端类型:tty.pty和pts 基本概念: 1. tty(终端设备的统称): tty一词源于teletypes,或者teletypewriters,原来指的是电传打字机,是 ...

  7. shell 知:bash

    文章目录 1. 介绍 1.1. 为什么使用shell编程 1.2. Sha-Bang(#!) 2. 基本 2.1. 特殊字符 2.1.1. 特殊字符 2.1.2. 控制字符 2.1.3. 空白 2.2 ...

  8. 提取知识点 blt (signal ,Terminal shell 正则表达式)

    1023 知识管理:网博士,有道笔记 学习方法: 枪挑一条线,滚扫一大片: 程序员分两类:一种是学过C语言的,一种是没有学过C语言的 读书由薄到厚,再由厚到薄 行业经典(Jolt), cheatshe ...

  9. linux终端terminal个性化配置(转)

    http://blog.csdn.net/pipisorry/article/details/39584489 {本文介绍Linux终端字体颜色设置.终端提示符显示内容设置.自定义alias命令} l ...

最新文章

  1. linux_2.6内核内存缓冲与I/O调度机制:
  2. Java加密解密入门
  3. python实现翻译功能_Python爬虫实现百度翻译功能过程详解
  4. Python学习笔记 -- 第一章
  5. 恰当地利用中间结果集
  6. 《算法之美》の链表问题の单向链表的反转
  7. 为什么大家都会往大城市跑
  8. 中国计量大学研究生复试c语言_中国计量大学2020考研招调剂生,25个专业
  9. Python selenium报错:selenium.common.exceptions.ElementClickInterceptedException
  10. 《私募证券投资基金业绩报酬指引(征求意见稿)》
  11. Java指纹识别开源代码SourceAFIS使用入门
  12. 安装axure插件以便打开原型文件
  13. matlab预测1人均gdp,基于时间序列模型下河南人均GDP的预测分析
  14. 微信公众号推文怎么做?
  15. android仿饿了么,Android 仿饿了么下拉Dialog
  16. python浏览器复制粘贴到word里(带格式的)
  17. Java实现 蓝桥杯VIP 算法提高 格子位置
  18. 计算机键盘锁不了怎么办,笔记本电脑键盘没反应是哪个键锁了?该怎么办
  19. 深度学习21_李宏毅_04_Local Minimum And Saddle Point
  20. 高数_第3章重积分_三重积分之2__先一后二和先二后一

热门文章

  1. 替换空格---StringBuilder
  2. 全国四级网络工程师操作系统部分考纲
  3. 04flex弹性布局子项常见属性总结
  4. numpy中的一些常见函数
  5. 郑州大学北校区oracle考试题,2019郑州大学软件学院oracle期末考试试题及答案(一)...
  6. Cesium调用天地图的新问题
  7. 157所中国内地高校上榜!最新世界大学学术排名发布
  8. se(3)-TrackNet: 数据驱动的动态6D物体姿态跟踪, 基于合成域的图片残差校准
  9. 系列篇|编写一个翻转事件极性的package
  10. 职场的你,如何《赢》?