终端与shell的关系
我们在使用Linux的时候会经常遇到终端和shell的概念。比如在桌面版的Ubuntu上面,我们可以在桌面上右击鼠标,点击“Open Terminal”来打开一个终端。此时,我们就可以在该终端中输入Linux命令了。有人可能会问,这不是shell吗?那么终端和shell到底是什么关系呢?
终端(英语:Computer terminal),是与计算机系统相连的一种输入输出设备,通常离计算机较远。根据功能不同,可分若干类。具有某些处理功能的终端称为灵巧终端或智能终端,这类终端有它自己的微处理器和控制电路;没有此功能的叫做哑终端,它没有微处理器。支持与计算机会话或处理的终端叫交互终端或联机终端。
说白了其实终端就是——人与机器交互的接口。
人和机器是两个相互独立的实体。当人使用机器时,必须借助某种接口(interface)才能与机器交流信息。台式机的接口包括显示器、键盘、鼠标、扬声器、麦克风等。CPU、内存、硬盘、光驱、显卡、网卡等其他硬件属于主机(host)。Unix和Linux把这种使得人和机器可以交互的接口称为终端。
终端具有两个基本功能:向主机输入信息和向外部输出信息。所以终端可以分为输入设备和输出设备。台式机的输入设备通常包括键盘、鼠标、麦克风,输出设备包括显示器、扬声器等。
我们可以将上面的两段内容归纳为两个公式:计算机 = 主机 + 终端 = 输入设备 + 输出设备
linux上面终端(terminal)(就是你输入指令的那个黑色框框)就是一个仿真终端,你可以把它当作一个模拟的输入设备。作用是提供一个命令的输入输出环境,在linux下使用组合键ctrl+alt+T打开的就是终端(ctrl+D可以关闭终端)。
在Linux中有图形界面和命令行界面(按Alt+Ctrl+F1~F6组合键可进行切换),图形界面下的命令行窗口,叫做伪终端。但是这个伪终端是跟那个脱离图形界面的、黑漆漆的、按Alt+Ctrl+F1~F6组合键出来的那个终端而说的。伪终端的工作方式是在桌面上申请一个窗口,然后在里面模拟显示出一个黑漆漆的界面。比如Gnome终端、Konsole终端、xterm终端、urxvt终端等等。
终端有以下几种:
物理终端:直接连接在主机上的显示器、键盘鼠标统称。在实际机架式服务器部署中,一般是多台服务器共享一套终端,简称KVM(Keyboard键盘,video显示器,mouse鼠标)
虚拟终端(tty):附加在物理终端之上,用软件方式虚拟实现,CentOS默认启用6个虚拟终端,可以通过快捷键来切换,切换方式:Ctrl-Alt-F[1--6], 对应的文件是/dev/tty#。可以同过tty命令来查看当前的虚拟终端号。tty是teletypewriter的简称。
伪终端(pty):两种应用场景,第一在图形界面下打开的命令行接口,第二基于ssh协议或telnet协议等远程打开的命令行界面,是运维工程师用的最多的一种连接服务器的方式。pts(pseudo-terminal slave)是pty的实现方法。
控制终端(/dev/tty) 这是个在应用程序中的一个概念,前台进程有个控制终端,就对应这个。不过它并不指任何物理意义上的终端,其实/dev/tty会映射到当前的设备(通过tty命令可以看到),比如你如果在控制台界面下(即字符界面下)那么dev/tty就是映射到dev/tty1-6之间的一个(取决于你当前的控制台号),但是如果你现在是在图形界面(Xwindows),那么你会发现现在的/dev/tty映射到的是/dev/pts的伪终端上。比如你可以输入命令 #tty 那么将显示当前映射终端如:/dev/tty1或者/dev/pts/0等。
聊到这里我们知道了,所谓终端,其实就是一个物理设备,也就是计算机的输入输出设备。
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
shell是一个命令行解释器,是linux内核的一个外壳,负责外界与linux内核的交互。shell是包裹在操作系统外层的一道程序,就好像是操作系统的壳,shell(壳)的名称也由此而来。shell接收用户或者其他应用程序的命令, 然后将这些命令转化成内核能理解的语言并传给内核, 内核执行命令完成后将结果返回给用户或者应用程序。当你打开一个terminal(终端)时,操作系统会将terminal和shell关联起来,当我们在terminal中输入命令后,shell就负责解释命令。
shell广义上可以指操作系统和用户接口的界面,图形界面也是一种shell。因为图形界面的本质也是实现“把人类用户的操作意图转述个内核”。
终端上所有命令都需要一个东西翻译解析一下,计算机才能理解并执行。这个翻译解析的东西叫SHELL解释器,RedHat和CentOS默认SHELL解释器叫:bash。
/bin/bash //在终端打开新的shell进程 exit //结束shell进程
3、shell和终端的关系
shell是一个程序,一个二进制可运行可执行的程序,一般情况下,我们并不会感觉它的存在,因为我们很少主动去调用它,除非我们人为去执行bash程序。那么shell跟终端有什么关系呢?
两者之间区别:终端本身并不会解析命令,它只是一个界面,负责人机交互的一个接口而已,真正处理命令的是shell。终端只负责提供一个输入命令的交互界面而已,在里面运行的命令是专门的命令执行程序shell来完成的。
终端有什么作用?一个常见的误解是:我们通过终端可以控制计算机,终端可以执行我们输入的命令,并不是这样。
终端的主要任务是接收用户输入的命令和字符,然后提交给shell,并且将命令执行完的结果反馈给用户。shell负责将命令翻译,在系统执行完之后将结果返回给终端。
shell和终端的关系就是shell是一个程序,一个二进制可运行可执行的程序。终端程序执行时会自动调用shell程序,每次打开终端(伪终端、虚拟终端)的时候,终端程序都会去调用shell。终端调用shell程序成功的情况下,终端就会显示如下的信息:
[root@localhost ~]#
其中root代表的就是登录人是谁,host指示登录到的主机,~表示当前操作目录,$表示的是命令提示符(如果登陆人是root的话就显示为#),表示等待输入命令。
如上图所示其中,root为打开shell的用户名;@为分隔符;local为主机名称;~为工作目录名称;#为身份提示符,#表示超级用户,$表示普通用户。