原本打算写一篇《计算机教育中缺失的一课》,涉及到 Shell。写着写着发现:什么是 Shell?什么是终端?什么是命令行?傻傻分不清了,竟然!于是,赶紧查阅了大把大把的资料学习了一下,最终,成功地制服了它们,太不容易了。
如果你直接在搜索引擎里搜“Shell、终端、命令行”这些关键词,也能找到大把的资料,但对于执拗的我来说,不通过自己的方式把它们消化一下,就感觉没有真正理解。另外就是,我想通过我的行文风格,让读者朋友们能更加清晰明了的理解它们之间的区别。
说句大实话,不管是 Shell 还是终端,还是命令行,在实际的工作当中,使用频率真的非常高,真的不要小看这些玩意。
如果你看过《碟中谍》、《谍影重重》这些谍战片,或者《黑客帝国》这类科幻片的话,应该记得上图中出现的情景。一个电脑大神,在一块黑色的窗口前敲来敲去,然后成功破解了某某某机密,或者成功关掉了某些摄像头之类的。
01、什么是命令行界面
命令行界面(英语:Command-line Interface,缩写:CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。
这是维基百科对命令行界面的定义,我认为蛮准确的。这种靠一行一行命令的输入输出进行交互的用户界面,就是命令行界面。
在图形化界面(英语:Graphical User Interface,缩写:GUI)已经完全普及的今天,普通用户在使用电脑的过程中几乎不用手动输入任何命令,点点鼠标就行了。我记得大一的时候,还需要学习 Java 的 Swing, 也是通过鼠标拖拽 NetBeans 提供的组件完成的。
在新手程序员眼里,那些能熟练使用命令行的程序员,都是大神级别的,非常高逼格。在大神的眼里,使用命令行可不只是为了装逼,而是为了追求极致的高效。
就连 Windows 这种追求极致图形化界面的操作系统,仍然没有完全放弃命令行,cmd.exe 和 powershell 就是例子。我在大一学习 Java 的时候,老师布置的第一个任务就是在 cmd 中执行 javac 和 java 命令,以便在屏幕上打印出“hello world”。
02、什么是终端
1946 年,由美国军方定制的第一台电子计算机 ENIAC 在美国宾夕法尼亚大学问世。这台计算器使用了17840 支电子管,重达 28 吨,造价约为 487000 美元。
也就是说,早期的计算机非常昂贵,非常庞大。它们通常放置在单独的房间内,而操作计算机的人坐在另外的房间里,通过某些设备和计算机进行交互,这些设备就叫做终端(Terminal),也叫做终端机。
早期的终端叫做电传打字机,一开始是用来收发电报的。但它既有可以发送信号的键盘,又能把接收到的信号打印在纸带上,所以完全可以作为人机交互设备来使用。
重要的是,电传打字机非常便宜。而早期的计算机设备都非常昂贵,就连现在看起来非常便宜的显示器和键盘在当时都非常的贵。电传打字机长下面这样,看起来是不是就像古董一样?
也就是说,早期的终端是一种可以连接到计算机上的带输入输出功能的外设,供普通的用户使用。
还有另外一种设备,和计算机是一体的,算是计算机的一个组成部分,供系统管理员使用,有着比普通终端更大的权限,这种设备叫做控制台(Console)。下图来源于西雅图活电脑博物馆。一台计算机一般只有一个控制台,但是可以连接多个终端。
不过,随着计算机的发展,控制台和终端的概念已经逐渐模糊,Console 与 Terminal 基本可以看作是同义词,因为我们既可以是管理员又可以是普通用户,就看我们要对计算机做什么。
早期的终端只有文本终端,就是那种只能接收和显示文本信息的终端。1978 年,DEC 公司制造出了一台支持 ANSI 转义序列与光标控制的智能终端,获得了空前的成功。
随着技术的进步,图形终端开始出现在公众的视野中,它不仅可以接收和显示文本信息,还可以显示图形和图像。不过,随着技术的进一步发展,图形终端也被淘汰了,取而代之的就是终端模拟器(Terminal Emulator)。
- Linux 下常用的终端模拟器有:Konsole、Xiki。
- MacOS 下常用的终端模拟器有:Terminal.app(系统自带)、iTerm2。
- Windows 下常用的终端模拟器有:Windows Terminal(集成了 Powershell、Cmd)、XShell。
人们为了省事,直接称呼终端模拟器为「终端」。
03、什么是 Shell
我们知道,操作系统有一个叫内核(Kernel)的东东,它管理着整台计算机的硬件,负责应用程序和硬件之间的交互工作。
但是呢,内核处于系统的底层,是不能让用户随意操作的。但用户又必须得操作系统,对吧?怎么办呢?Shell 就应运而生了。Shell 通常指的是命令行界面的解析器,一个为操作系统提供访问内核的程序。
Shell 通常可以分为两种:命令行 Shell 与图形化 Shell,前者提供了一个命令行界面,后者提供了一个图形化界面。
对于 Mac 用户来说,访达就是一个图形化 Shell,见下图。
终端就是一个命令行 Shell,见下图。
知名的命令行 Shell 有多种,可通过 cat /etc/shells
命令来显示本机上的 Shell。简单说两种吧。
- bash,全名叫做 Bourne-Again SHell,绝大多数 Linux 发行版的默认 shell。
- zsh,全名叫做 Z shell,新版 MacOS 的默认 shell。对 Bourne shell 做出了大量改进,同时加入了 Bash、ksh 及 tcsh 的某些功能。
04、终端与 Shell 的区别
终端干的活儿是从用户(通过键盘和鼠标)这里接收输入,然后扔给 Shell,然后把 Shell 返回的结果展示给用户(通过显示器)。
Shell 干的活儿是从终端那里拿到用户输入的命令,解析后交给操作系统内核去执行,然后把执行结果返回给终端。
好了,就说到这吧,感觉计算机的一些知识还是蛮有趣的。
参考链接:https://segmentfault.com/a/1190000016129862 温馨提醒:记得把「沉默王二」加个星标啊,这样就不会错过更新啦~