公众号旧文

为什么没有扩展名,Linux 也知道怎么打开?

作者:胖子阅读 —

在 Windows 里,我们早已习惯了通过扩展名来区分文件类型,而操作系统也会根据扩展名,将文件关联到对应的软件:

.txt  用记事本打开
.mp4  用播放器打开
.jpg  用图片查看器打开
.exe  直接运行

文件扩展名,就像是文件的身份。

很多人看到没有扩展名的文件,就不知道它是什么了。

但到了 Linux 这边,你会发现:

/bin/bash
/etc/passwd
/usr/bin/python3
/var/log/syslog

几乎全都没有扩展名。

第一眼看过去,的确不知道它们都是什么类型的文件。

但 Linux 不仅认识它们,还知道:

  • 哪些能执行
  • 哪些是文本
  • 哪些是目录
  • 哪些应该交给解释器运行

那 Linux 到底是怎么知道,该用什么软件打开它们的?

原来,Linux 从来不相信文件名和扩展名。

一、Windows 的世界:文件名决定一切

在 Windows 中:

hello.txt

之所以能双击用记事本打开,并不是系统读到了里面的内容。

而是因为:

.txt

这个扩展名,在注册表里绑定了记事本(notepad.exe)这个程序。

系统看到:

.txt

就知道这是文本文件。

于是启动 notepad.exe 来打开文本文件。

所以 Windows 是先看名字,再决定怎么处理。

二、Linux:名字只是个标签

在 Linux 看来:

movie.mp4

和:

abc

没有本质区别。

因为文件名只是字符串。

真正重要的是:

  • 文件内容
  • 文件结构
  • 权限
  • 文件头

而不是:

.mp4

这种后缀。

所以你完全可以:

mv movie.mp4 hello

视频依然能播放。

三、那 Linux 怎么知道文件是什么?

关键在于文件自己会暴露身份。

很多文件,开头都有固定标记,Magic Number(魔数)

比如:

PNG 图片

开头:

89 50 4E 47

ZIP 压缩包

开头:

50 4B 03 04

Linux 可执行程序

开头:

7F 45 4C 46

四、所以 Linux 根本不需要扩展名

因为文件自己已经告诉系统它是什么类型。

这也是为什么:

/bin/bash

没有 .exe却照样能运行。

图片

因为内核读取文件头后发现:

7F 45 4C 46

就知道这是可执行程序了。

五、那脚本为什么也能直接运行?

比如:

hello.py

即使没有 .py,也可能执行:

./hello

因为文件开头的Shebang(解释器声明)

#!/usr/bin/python3

意味着:请用 Python 解释器运行我。

于是内核自动启动:

/usr/bin/python3

并把脚本交给它。

所以 Linux 判断怎么打开,看的不是扩展名。

而是文件内容里的真实声明。

六、Linux 更像验身份证

如果说 Windows 是看文件穿了什么衣服。

那 Linux 则更像查身份证。

它会真的去检查:

  • 文件头
  • 格式结构
  • 执行权限
  • inode 类型

所以 Linux 更较真。

七、为什么这是一种更高级的设计?

因为扩展名可以骗人。

比如:

virus.txt.exe

很多人只看到:

.txt

就中招了。

但 Linux 表示:我不信你的名字,我要看你到底是什么。

这也是 Unix 哲学的一部分:

关注真实结构,而不是表面形式。

八、那 Linux 完全不用扩展名吗?

也不是。

但扩展名更多是给人看的。

比如:

.conf
.log
.tar.gz
.mp4
.jpg

方便:

  • 阅读
  • 分类
  • 编辑器高亮
  • 搜索

但 Linux 内核的确并不依赖它们。

九、一句话总结

Windows:你叫什么名字,我就怎么对待你。

Linux :你嘴上说自己是谁不重要,我要看你骨子里到底是什么。