首页 > 系统相关 >理解 Unix/Linux 中的 Terminal、Shell、TTY 和 Console

理解 Unix/Linux 中的 Terminal、Shell、TTY 和 Console

时间:2024-07-31 22:25:56浏览次数:18  
标签:TTY Shell Console 终端 Linux 设备 模拟器

文章目录


在 Unix 和 Linux 系统中,有一些术语常常让人困惑,比如 “terminal”、“shell”、“tty” 和 “console”。本文试图通过通俗易懂的语言来解释这些概念,并结合一些历史背景,帮助大家更好地理解它们。

1 Terminal

1.1 传统意义上的 Terminal

最初,终端(terminal)是指一种物理设备,通过它用户可以与计算机进行交互。早期的终端通常是电传打字机(teletypewriter,简称 TTY),一种类似打字机的设备,可以通过电缆与计算机连接,进行输入和输出操作。

也就是说,最初程序员可以通过类似于下图这种设备连接到计算机,于计算机进行交互。

下图是 Teletype Model 15:https://www.youtube.com/watch?v=fLkBb9MuTjE
在这里插入图片描述

1.2 现代的 Terminal

随着计算机的发展,终端的概念逐渐虚拟化。今天,我们在图形用户界面(GUI)中看到的终端窗口,其实是终端模拟器(terminal emulator),它模拟了传统终端的功能,允许用户在图形环境中使用命令行界面(CLI)。

下图为 GNOME 桌面的终端模拟器
在这里插入图片描述

2 TTY

2.1 TTY 的起源

TTY 是 teletypewriter 的缩写,最早用于描述一种机械设备,可以远程发送和接收文本信息。在 Unix 系统中,TTY 逐渐演变为一种抽象设备,用于处理用户与系统之间的交互。

2.2 Linux 中的 TTY

在 Linux 中,TTY 通常指的是终端设备文件,这些文件位于 /dev 目录下,比如 /dev/tty1/dev/pts/0 等。TTY 设备可以是物理连接的(如串口终端),也可以是虚拟的(如通过 SSH 连接的终端)。

在 Linux 和类 Unix 操作系统中,有一种核心设计哲学,即“一切皆文件” (Everything is a file)。这意味着系统中的大多数资源和设备都可以通过文件系统接口进行访问和操作。

下图为 /dev 下的 tty 文件:
在这里插入图片描述

2.3 虚拟终端

  • 虚拟终端(virtual terminal):在 Linux 系统中,用户可以通过按 Ctrl + Alt + F1F6 切换到不同的虚拟终端。这些虚拟终端允许多个独立的登录会话。虚拟终端是一个全屏终端,与图形桌面上的终端窗口不同。

当我在ubuntu桌面版中按下 Ctrl + Alt + F3 时,出现了下图这样的界面:
在这里插入图片描述

2.3.1 虚拟终端为什么是虚拟的?

虚拟终端是一个模拟物理终端功能的程序。

在早期的计算机系统中,终端通常是物理设备,例如电传打字(Teletypewriter,TTY)或视频终端(Video Terminal),这些设备通过键盘输入数据并在屏幕上显示输出。物理终端是实际存在的硬件设备,直接连接到计算机,用于输入和输出操作。

虚拟终端通过软件模拟了物理终端的功能,通过软件实现键盘输入和屏幕输出。常见的虚拟终端包括 gnome-terminalkonsole 等终端模拟器,它们在图形用户界面(GUI)环境中运行。

2.4 伪终端

  • 伪终端(pseudo-terminal,简称 pty):伪终端在两个或多个进程之间建立异步双向通信(IPC)通道的虚拟设备端点对,用于模拟终端设备,为终端模拟器提供支持。常见的伪终端设备文件位于 /dev/pts/ 目录下。

2.4.1 伪终端的组成

伪终端由一对设备文件组成:

  1. 主设备(Master):负责与终端模拟器或远程登录服务器(如 Telnet 或 SSH 服务器)进行通信。
  2. 从设备(Slave):模拟硬件串口设备,供终端导向程序(如 Shell)读取和写入数据。

2.4.2 伪终端的工作原理

伪终端的工作流程如下:

  1. 用户与终端模拟器交互:用户通过终端模拟器(如 xterm、GNOME Terminal、Konsole 等)输入命令。
  2. 终端模拟器与主设备通信:终端模拟器将用户输入的命令发送到主设备。
  3. 主设备与从设备通信:主设备将命令传递给从设备,从设备模拟实际终端设备,供 Shell 等进程使用。
  4. 返回输出:Shell 执行命令后,将输出结果返回给从设备,从设备再通过主设备传回终端模拟器,最终显示给用户。

2.4.3 伪终端的应用

  • 终端模拟器:如 xterm、GNOME Terminal 等,允许用户在图形界面中使用命令行。
  • 远程登录:如 SSH 和 Telnet 服务器,允许用户远程连接并操作系统。
  • 会话管理:如 Screen 和 Tmux,提供会话持久性,允许用户断开连接后重新连接会话。

当你在终端中输入 tty 命令时,系统会返回当前终端设备的文件路径。
在这里插入图片描述
上图中,系统返回了 /dev/pts/7,这表示当前使用的是一个伪终端设备。

下图表示通过 vscode ssh 连接到 Linux 后,使用的内嵌终端也是伪终端:
在这里插入图片描述

3 Console

3.1 Console 的定义

Console 通常指的是直接连接到计算机的主要终端设备。在物理意义上,Console 是计算机的键盘和显示器,通常用于系统的初始设置和维护操作。

3.2 Linux 中的 Console

在 Linux 系统中,Console 也可以是一个虚拟终端,通过特殊的按键组合(如 Alt + Fn 键)进行切换。系统启动时的日志信息和内核消息通常会输出到 Console 上。

4 Shell

4.1 Shell 的定义

Shell 是一种命令行解释器,是用户与操作系统之间的桥梁。用户在终端中输入命令,Shell 负责解释并执行这些命令。Shell 本身并不是终端,但它通常运行在终端或终端模拟器中。

4.2 常见的 Shell

  • Bash:最常用的 Shell,默认安装在大多数 Linux 发行版中。
  • Zsh:功能强大且高度可定制的 Shell,近年来越来越受欢迎。
  • Fish:以用户友好和简洁著称的 Shell。

总结

  • Terminal:用户与计算机交互的设备或模拟器,可以是物理的或虚拟的。
  • TTY:源自电传打字机,现为 Unix/Linux 中的终端设备文件。
  • Console:主要的终端设备,直接连接到计算机,用于系统管理。
  • Shell:命令行解释器,运行在终端中,用于解释和执行用户的命令。

参考链接

封面

在这里插入图片描述

标签:TTY,Shell,Console,终端,Linux,设备,模拟器
From: https://blog.csdn.net/Beihai_Van/article/details/140832894

相关文章

  • Netty详解
    文章目录概述线程模型的演变传统IO模型Reactor模型单Reactor单线程单Reactor多线程主从Reactor多线程Netty模型Netty核心组件BootstrapEventLoop使用Netty搭建TCP服务搭建HTTP服务TCP粘包拆包自定义协议通信Netty内存池管理PoolArenaPoolChunkListPoolChunkPoolSubpa......
  • 使用Shell登录Jenkins
    使用Shell登录Jenkins在root用户下使用sujenkins​命令切换到jenkins​用户时失败.可以先检查jenkins​用户有没有shell权限:grepjenkins/etc/passwd如果jenkins​用户的登录shell设置为/bin/false​,它会阻止用户登录系统。手动编辑/etc/passwd​文件来更改......
  • 虚拟机安装Rock和ubuntu并实现shell远程连接
    一、VMware安装在网上下载安装包打开安装包一路点击下一步直到完成安装即可。安装完成之后可以根据需要修改网络配置使用默认也可。在“编辑”-“虚拟网络编辑器”中修改弹出的窗口中点击“更改配置”二、虚拟机安装rocky8.62.1下载镜像可在官网或者国内开源镜像站下载2......
  • 如何用C语言写一个简易的shell
    参考文章https://danishpraka.sh/posts/write-a-shell/参考文章是英文的,我基本上是结合自己的理解翻译了一下,代码加了些注释,对阅读英文感兴趣的可以直接看这篇就可以了然后原作者还增加了管道等等功能,在参考文章最后的click那里,可以跳转到github上的仓库运行环境linux环境即......
  • 使用finallshell连接linux
    用户可以去FinalShell的官网上下载,只需点击下载地址,即可轻松下载安装包。傻瓜式安装点击到底。使用双击打开页面,新建连接右击连接,新建》ssh 连接,双击新建的连接,如下界面即连接成功。新建文件夹,右键新建文件夹。新建文件,在文件夹右键新建文件。命令在命令区域正......
  • POSIX-shell学习笔记
    学习POSIXshell建议使用dash,因为它很快:https://unix.stackexchange.com/a/148098mandash:OnlyfeaturesdesignatedbyPOSIX,plusafewBerkeleyextensions,arebeingincorporatedintothisshell.条件判断mandash,然后搜索testexpression,可以看到完整的列表。ife......
  • netty核心流程(一):服务端如何建立连接
    为了接收连接请求,Netty服务端应该做些什么事情?根据JavaNIO的知识,服务端在准备接收客户端连接之前做了下面几个工作,我们可以带着问题往下看。服务端对连接请求是如何初始化的?如何把用户定义的处理逻辑childHandler加入到Netty的处理流程里?如何在Socket上绑定一个端......
  • 认识netty的基本组件
    JavaNIOVSNetty有了JavaNIO,而且Netty也是基于JavaNIO实现,那么为什么不能直接用JavaNIO来实现网络通信模块呢? 接下来我就给大家解释一下原因。如果我们用JavaNIO来开发网络通信组件,势必会直接面对很多网络通信的问题。比如,网络连接异常如何处理、网络的闪断怎么......
  • nohup ./minio server --address :9000 --console-address :9001
    [root@ecm-8cc1minio]#./minioserver/opt/minioINFO:Formatting1stpool,1set(s),1drivesperset.INFO:WARNING:Hostlocalhasmorethan0drivesofset.Ahostfailurewillresultindatabecomingunavailable.MinIOObjectStorageServerCopyright:20......
  • shell和bash 你是不是傻傻分不清?什么又是shell脚本
    什么是shellShell在计算机科学中是指一个提供给用户使用操作系统功能的接口。这种接口可以是图形化的,也可以是基于文本的命令行接口。在Linux和Unix-like系统中,“shell”一词通常特指命令行接口(CommandLineInterface,CLI)。它允许用户通过键入命令来与操作系统交互。She......