第3章 为什么输入一个命令,电脑就会执行?

第3章 为什么输入一个命令,电脑就会执行?

上一章我们知道程序不能直接控制硬件,必须经过 Kernel。

但是又出现一个问题。例如:你打开 Linux。

输入:

ls

为什么电脑就知道:

我要查看目录?

是谁认识:

ls

这个单词?

Kernel吗?

不是。

真正认识它的是:

Shell。


第1节 什么是 Shell?

英文:

Shell

中文一般翻译:

命令解释器(Command Interpreter)

为什么叫 Shell(外壳)?

因为它包裹在 Kernel 外面。

可以理解成:

用户 ↓ Shell ↓ Kernel ↓ 硬件

Shell就是:用户和Kernel之间的翻译官。


举一个生活例子。

假设:

你去银行,你不会直接操作银行后台系统。

而是告诉柜员:

我要转账。

柜员把你的意思翻译成:

银行后台能理解的操作。

这里柜员就是Shell。

银行后台就是Kernel。


所以Shell就是

一个负责理解命令、调用程序、把结果显示出来的软件。


第2节 Shell 到底做了什么?

假设输入:

pwd

整个过程其实发生了很多事情。

第一步:

键盘收到:

p w d

第二步:

Terminal显示:

pwd

第三步:

你按Enter。

第四步:

Shell开始工作。

它首先想:

pwd 是什么?

它开始寻找:

有没有叫 pwd 的程序?

找到以后执行它。

程序里面需要知道:当前目录。

于是程序向Kernel发起:系统调用。

Kernel返回:

/home/x

Shell收到以后,把结果交给Terminal。

Terminal显示出来整个流程:

键盘 ↓ Terminal ↓ Shell ↓ 程序 ↓ Kernel ↓ 硬盘/内存 ↓ Shell ↓ Terminal ↓ 屏幕

学习每一个命令其实都是这个流程。


第3节 Terminal 是什么?

这是很多新手最大的误区。

很多人认为黑窗口就是Shell,其实不是。

例如:

Windows里面你看到:

Windows Terminal

它只是一个窗口程序。

Linux里面:

例如:

GNOME Terminal

也是一个窗口程序。

它负责:

  • 接收键盘输入
  • 显示文字
  • 复制粘贴
  • 滚动历史记录
  • 改变字体颜色

但是:

它不会解释:

ls

什么意思。

解释命令的始终是:Shell。

所以Terminal更像:一本空白的笔记本。

Shell:才是真正会思考的人。


第4节 Terminal 和 Shell 的关系

假设:

你和国外朋友聊天。

你使用:微信。

微信负责:

输入文字 发送消息 显示消息

但是微信不会翻译,真正翻译的人是:翻译软件。

Linux也是一样。Terminal负责:

输入 显示

Shell负责:

理解命令 执行命令

所以关系应该是:

你 ↓ Terminal ↓ Shell ↓ Kernel ↓ 硬件

第5节 Bash 是什么?

现在能解释:

为什么很多Linux教程。

第一句话就是:

bash

Bash是什么?

它是一种Shell。

Linux里面有很多Shell。

例如:

bash zsh fish dash sh

都属于Shell。

只是功能不同,风格不同。


企业里面最常见的是:

bash

Mac现在默认:

zsh

有些高级用户喜欢:

fish

因为自动补全更智能,界面更漂亮。


所以以后别人说:

打开 Bash。

真正意思就是:

打开 Bash 这个 Shell。


第6节 Windows 为什么有 CMD 和 PowerShell?

很多人觉得:Linux才有Shell。

其实不是。

Windows也有。

例如:

最老的是:

CMD

后来微软推出:

PowerShell

PowerShell其实也是Shell。

只是能力比CMD强很多。

例如:

Linux:

ls

Windows CMD:

dir

作用其实一样,都是查看目录,只是命令不同。


第7节 Shell 不只是执行命令

很多新手认为Shell只能输入:

ls

其实不是。

Shell本身还是一种编程语言。

例如:

echo Hello

输出:

Hello

例如:

name="Tom" echo $name

输出:

Tom

以后你会学习:Shell Script(Shell脚本)。

就是把很多命令写成一个程序,自动执行。

所以很多服务器维护,其实都是Shell脚本完成的。


第8节 PATH —— Shell 怎么知道命令在哪?

这里有一个非常重要的问题。

假设:

你输入:

ls

Shell为什么知道去哪里找?

答案就是:

PATH(环境变量)

PATH可以理解成:

一张"搜索目录清单"。

例如:

PATH里面记录了:

/usr/bin /bin /usr/local/bin

当你输入:

ls

Shell就会先去:

/usr/bin

找。

没有。

继续:

/bin

找。

找到:

/bin/ls

于是执行它。

所以真正执行的是:

/bin/ls

只是PATH帮你省略了。

以后安装很多软件其实就是把程序放进PATH里面,这样,任何地方都能直接运行。


第9节 一个完整命令的生命周期

现在我们终于可以完整解释,为什么:

ls

能够工作。

整个过程:

① 你按键盘 ↓ ② Terminal显示文字 ↓ ③ 按Enter ↓ ④ Shell读取命令 ↓ ⑤ Shell通过PATH寻找程序 ↓ ⑥ 找到: /bin/ls ↓ ⑦ 执行ls程序 ↓ ⑧ ls向Kernel请求读取目录 ↓ ⑨ Kernel读取磁盘 ↓ ⑩ Kernel返回数据 ↓ ⑪ ls整理输出 ↓ ⑫ Terminal显示结果

看到这里你应该已经发现:一个看似简单的命令,背后其实经过了十几个步骤。


本章总结

今天请记住七句话:

  1. Terminal 是窗口,它负责输入和显示。
  2. Shell 是命令解释器,它负责理解和执行命令。
  3. Kernel 不认识lspwd等命令,它只负责系统资源和系统调用。
  4. Bash、Zsh、Fish 都是不同的 Shell。
  5. Windows 的 CMD 和 PowerShell,本质上也是 Shell。
  6. PATH 告诉 Shell 去哪里寻找可执行程序。
  7. 每执行一个命令,都经历"Terminal → Shell → 程序 → Kernel → 硬件 → 返回结果"这一完整流程。

到这里,你已经完成了 Linux 世界观的三块基石

现在你已经理解了:

  • 第1章:操作系统是什么。
  • 第2章:Kernel(内核)如何管理硬件。
  • 第3章:Shell 和 Terminal 如何让人类与 Kernel 交流。

这三个知识点,构成了后面所有 Linux 学习的基础。


下一章预告(非常重要)

从下一章开始,我们终于要进入真正的 Linux 世界。

主题是:

Linux 的文件系统——为什么 Linux 没有 C 盘、D 盘?

这一章会彻底改变你对文件和目录的理解。学完后,你不仅知道/home/etc/var是做什么的,还会理解一句 Linux 圈最经典的话:

Everything is a file(万物皆文件)。

这是 Linux 最独特、也是最优雅的设计思想之一。