揭开图形界面的面纱
现代的操作系统其实很喜欢把事实隐藏在图形界面下面。当你试图浏览图片,系统给你展示的是一组图片,而不是“一个文件夹里面的一系列文件”。
所以,对于大部分的人来说,尤其是各位读者,在接触编程的时候可能对非图形界面的一些元素感到陌生,例如:
- 文件的路径
- 命令行窗口
- 文件的权限
- 等等。
所以,本期课程,目的就是——打好基础。揭开图形环境下的面纱,了解到真正的本质。
认识我们的第一位朋友:Powershell
随便搜索一下百度,很多Windows教程里面必备的一句话就是——“按下Win+R,输入cmd,回车,打开‘命令提示符’。”
对于大部分的电脑小白们,这一点很恐怖。黑底白字,看不懂的英文命令和缩写,还有带着严肃的点阵(Windows 10-)或者仿宋(Windows 10)字……但是,了解操作系统本身,命令行又是绕不开的。
同时也请各位记住——不要看不起命令行。命令行脚本本身也是一门相当有用的编程语言——甚至如果你们未来不走计算机路线的话,它比任何一门语言都更有用。
鉴于普通的命令提示符过于陈旧,估计很多人也对它的印象不太好,在我们的课程里,我们将使用PowerShell Core这一微软全新的命令行。PowerShell Core强大的多,也更加的易于理解。是作为基础的非常好的语言。
2.1 PowerShell 的安装
工欲善其事必先利其器。认识和使用PowerShell的第一步是安装它。下列是各种安装方式:
2.1.1 Windows安装PowerShell
使用WinGet命令行工具.
你至少需要 Windows 10 版本 1809 才能使用这一工具。如果不知道的话,请在“设置”中搜索“系统信息”然后找到“内部版本号”,这是一个五位数字;当这个数字大于17763,WinGet才是可用的。
按下 Win + R,一字不差的输入以下命令:
winget install --id Microsoft.PowerShell --source winget按下回车。如果提示提升则同意;按照界面上的提示做,然后耐心等待一直到弹出的窗口消失。
使用常规的方式安装.
从这里下载安装包。下载完毕后,解压到任意目录;这个“目录”下应该有要有一个pwsh.exe。
如果感到困惑,建议使用Bandizip智能解压。
2.1.2 在 MacOS 上安装 PowerShell
按理来说一般的macOS会带上brew作为包管理器。打开搜索界面输入“terminal”,在弹出来的框中输入:
brew install powershell如果提示输入管理员密码,或Touch ID,请验证。
2.1.3 在Linux上安装PowerShell
你来这里是扮猪吃老虎吗?如果不是,请你咨询给你这台系统的人,或者咨询AI。
2.2 让我们开始吧!
打开你刚刚安装的powershell。如果你用的是压缩包,那就是解压出的pwsh.exe,否则请你在整个系统中搜索pwsh.exe并执行。
你应该会看到如图所示的界面:
活动一下手腕,让我们开始吧!
PowerShell令人生畏——真的吗?
3.1 快速过一遍概念
正如任何其他的命令行,PowerShell 也是“命令”式的。
当然PowerShell的“命令”非常直接——每个命令一定由两个部分组成——一个谓语,一个名词。在你们刚刚打开的Powershell中,输入:
Get-Verb你就可以看到所有的“动词“。可以注意到表头是这几列:
| Verb (动词前缀) | AliasPrefix (别名前缀) | Group (动词组别) | Description (这个动词的描述) |
| … | … | … | … |
你可以看到,PowerShell 里的动词被分成了好几个组别(Group)。比如最常见的 Get(获取)属于 Common(通用)组,Set(设置)、New(新建)、Remove(移除)等也都在此列。这种规范的好处是:即使你遇到一个完全陌生的命令,只要看一眼它的动词,就能大概猜出它是干什么的。
既然有了“谓语”(动词),自然就少不了“名词”。如果说动词决定了你要“做什么动作”,那么名词就决定了动作的“对象是谁”。在 PowerShell 中,名词通常代表系统里的一个实体,比如 Process(进程)、Service(服务)、ChildItem(子项)等。将它们用连字符 - 拼起来,就构成了一个完整的 PowerShell 命令。这种结构被称为 “谓语-名词” 语法。几个最常见的组合有:
Get-Process # 获取当前所有的进程(运行中的程序)
Get-Service # 获取当前系统所有的服务这就相当于英语里的“动宾结构”——“取-进程”、“取-服务”。非常直白,非常符合直觉。
现在,既然你已经懂了“谓语-名词”的套路,可以试着用 Get-Command 这个命令,来探索一下 PowerShell 里到底有多少个针对“进程”的命令。在终端输入:
Get-Command -Noun Process按下回车,你就能看到系统里所有针对“进程”操作的命令了(比如 Get-Process, Stop-Process, Start-Process 等等)。这就好比查字典,先锁定了名词“进程”,然后看有哪些动词可以搭配它。
3.2 修饰动作的辞藻:参数
前面我们拆解了“谓语-名词”的骨架,但骨架虽立,血肉未丰。如果只发一句“取物”的指令,未免过于生硬,需要进一步补充细节,命令才算完整。
古人行文讲究辞藻修饰,将帅发令也需详明机宜。若仅命士卒“取水”,士卒必然茫然:去何处取水?用何器皿盛装?取多少量为宜?
在 PowerShell 中,解答这些疑问、修饰动作细节的角色,叫做参数。参数通常以连字符 - 开头,紧随命令之后。如果说“谓语-名词”定下了“做什么”的基调,那么“参数”就规定了“做哪一个”或“怎么做”的细则。例如,Get-Process 本意是获取所有进程,但系统内进程浩如烟海,难以遍览。若附以参数 -Name pwsh,就清晰的多:
Get-Process -Name pwsh此处的 -Name 是参数名,pwsh 是它的值。这就好比填一张详尽的指令表单:动作既定,再填明细则,指令方才圆满。所谓“辞达而已矣”,参数的妙处,就在于让命令的意图精确到细微之处。
3.3 形神兼备的实质:对象
说到命令行,若你曾接触过老旧的 CMD 或 Linux 的 Bash,大概会知道它们输出的多是白纸黑字的“纯文本”。若想从一团乱麻般的文字中提取有用的信息,还需动用正则表达式等利器去切割,刀劈斧凿,甚为劳神。
但 PowerShell 的设计哲学一洗此弊。在它的世界里,命令吐出的不是纸面上的虚文,而是结构化的实体——这便是编程中的对象。
那对象又是什么?不妨将其视作一个形神兼备的“数据胶囊”。它不仅有表面呈现的数据,内里更包含了数据的结构(属性)与可以执行的动作(方法)。当你在 PowerShell 中输入 Get-Process,屏幕上看似只是一张表格,底层实则抛出了一枚枚“进程对象”。每枚对象都如同一卷档案,详载进程名、ID、内存占量,甚至附带了“终结此进程”的指令。 旧时命令行递给你一页印满字迹的纸,需你自行圈点;而 PowerShell 递给你的是一封装订齐整的档案,条理分明,任君取用。这是面向对象的哲学,也是 PowerShell 名中“Power”的真意。
3.4 川流不息的经络:管道
既然得到了实物,便可以让其流转。水利万物而不争,川流不息乃自然之理。PowerShell 中承接这种流转的机制,叫做管道。 管道用一条竖线 | 表示。它的作用是把左边命令吐出的对象,原封不动地作为右边命令的输入。前者之果,即为后者之因,犹如工厂流水线般前承后继,丝竹相和。 比如:
Get-Process | Sort-Object -Property CPU -Descending这行代码的流转之妙在于:
Get-Process采撷出满盘的进程对象,如源头活水。|将这些对象毫无损耗地送向下游。Sort-Object在下游接受,无需费力解析文本,直接阅读对象身上的标签(属性),按-Property CPU(CPU占用率)为序,加-Descending(降序)之令,重新排布阵列。
以前如果干这种事情,需写上数行繁复的文本处理脚本;今借着对象与管道之便,不过如拼积木般自然。至此,我们便构筑了 PowerShell 的概念地基:谓语-名词打下根本,参数用来具体化,对象承载着实际,而管道用来传递。明白了这一切,后续的实践自然豁然开朗。
这一切背后的,操作系统的本来面目
我们平日里对着屏幕点鼠标,以为那便是电脑的全部。图标整整齐齐,窗口花里胡哨,仿佛电脑是个温文尔雅的绅士。但这绅士的内里,其实不过是个冷酷而精于算计的管家。这层漂亮的面子,操作系统称之为“图形界面”。
你在 PowerShell 里敲一个 Get-Process,屏幕上滚过一连串名字。你以为那是“程序”?不,那只是管家给一群抢占资源者编的号。每一个所谓的“进程”,底子里不过是内存中一段正在狂奔的指令序列,它们为了几毫秒的 CPU 时间片,在底层互相厮杀。操作系统的调度器像个面无表情的监工,谁的时间到了,便毫不留情地一刀切下,换另一个上来。你所见的“未响应”,不过是这厮杀中,某一方卡住了脖子,喘不过气来罢了。
再说“文件”。我们在资源管理器里建个文件夹,自以为在书架上腾了个空格。然而剥去这层皮,哪里有什么“文件”?硬盘上不过是一圈圈磁道上排列的 0 和 1,或是闪存颗粒里攒聚的电荷。操作系统费尽心机,搞了个“文件系统”的障眼法,把那些毫无生气的电磁状态,伪装成有头有尾的档案。你输入的那串“路径”,不过是给这障眼法指路的暗号罢了。
还有“权限”。这是操作系统最傲慢的脾气。它将内存划分出三六九等,内核是至高无上的皇权,用户程序不过是匍匐在地的蝼蚁。你想要改一个系统文件?它冷笑一声:“Access Denied(访问拒绝)”。这并非它不讲理,乃是它深知,一旦放任了蝼蚁触碰地基,整个大殿便会轰然倒塌。
计算机科学里有一句格言,叫“任何问题都可以通过引入一个中间层来解决”。这话的另一面便是:你所见的一切,都是被精心包装过的抽象。
图形界面抽象了机器的暴戾,给了普通人一点可怜的慰藉;而命令行,则是逼着你直面这抽象背后的骨架。看透了进程的厮杀,看透了文件的伪装,看透了权限的傲慢,你便算是摸到了操作系统的骨相。
从骨相到心智:命令行背后的编程思想
刚才我们扯下了图形界面的面纱,直视了机器底层的冷酷与厮杀。看惯了这些,未免让人觉得硅基世界是个令人窒息的角斗场。但大可不必如此悲观,人类发明编程,本意并非为了折磨自己,而是为了在复杂中建立秩序。
秩序的建立,依赖的正是那些潜藏在命令操作背后的编程思想。
5.1 抽象:认知的阶梯
我们说“面纱”掩盖了真相,但这层面纱并非纯粹的虚伪,它是人类认知的阶梯。面对动辄百亿晶体管、无数电信号跳动的硬件,若没有“文件”、“进程”这些概念,人脑必定会陷入信息的汪洋而崩溃。
编程的第一大思想,便是抽象。
当你输入 New-Item 新建一个文件时,你不需要知道硬盘的磁头寻道了多少次,也不用管文件分配表改了哪些字节。操作系统把那些繁杂的物理细节打包藏好,只给你露出一个干净的概念:“文件”。PowerShell 也一样,它把复杂的系统 API 调用抽象成“谓语-名词”,让你不用懂 C 语言,也能指挥千军万马。
5.2 组合:积木般的 Unix 哲学
在 PowerShell 中,管道 | 是最令人心旷神怡的发明。它背后映射的,是编程界大名鼎鼎的 Unix 哲学:
让每个程序只做好一件事,然后通过组合来完成复杂的任务。
传统的图形软件往往是庞然大物,一个软件想包揽一切,最终臃肿不堪。而命令行则不同。Get-Process 只负责拿数据,Sort-Object 只负责排序,Stop-Process 只负责终结。它们各自独立,互不干涉,却因为管道的存在,得以像乐高积木一样拼接。
这种模块化与组合的思想,是软件工程的灵魂。好的代码,绝不是一锅炖到底的大杂烩,而是由一个个职责清晰的小模块拼装而成。当你学会了用管道将简单的命令串联成强大的工作流,你便掌握了编程中最优雅的艺术。
5.3 封装:数据与行为的交融
所以,最后,我们回过头再看 PowerShell 的“对象”。
在早年的编程中,数据和处理数据的逻辑是分家的,就像一堆零件散落一地,你得自己找工具去拧螺丝。而面向对象思想的出现,改变了这一切。
PowerShell 输出的“进程对象”,不仅仅是一堆数字(内存、CPU),它本身还绑定了“停止”这个动作。这便是封装:将数据和操作数据的方法绑定在一起,形成一个独立的实体。
这就好比你在生活中面对一辆汽车,你不需要知道发动机气缸的点火原理,你只需知道踩下油门这个“方法”,汽车这个“对象”就会自己完成加速的内部逻辑。封装让复杂变得可控,让接口变得简单。
所以,当你敲下那一行行命令时,你并非只是在死记硬背几个英文字母。你是在与数十年来人类在计算机科学领域积累的智慧对话。理解了抽象、组合与封装,你就握住了编程思想的三把钥匙。
更多的话……
或许在一些地方你会看见,很多学计算机的人都怪怪的。这是为什么呢……
如果你上完了刚刚那两节课,你就知道——计算机是稳定的,可控的,不变的——1+1永远等于2,没权限永远干不了事情。
但是,现实世界完全不同。它是不可控的,难以把握的。所以,那些人的“怪”,某种程度上,并不是因为“计算机”让他们变怪。而是他们——需要从计算机身上,找回一种难得的可控感,接纳感。
所以下次再见到这些人,无论是不太一样,还是身份认同……请不要在背后指指点点。他们需要这种难得的安宁。