公众号旧文
为什么没有扩展名,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 :你嘴上说自己是谁不重要,我要看你骨子里到底是什么。