公众号旧文
Linux 软链接和 Win 快捷方式有什么区别?
相信你在看到这样的内容时也会产生疑问:
/sbin/init -> /lib/systemd/systemd
这是不是就相当于 Windows 的快捷方式?
答案是:
可以这样理解,但它比 Windows 的快捷方式更强大,也更底层。
今天我们就来聊聊 Linux 的软链接(Symbolic Link)和 Windows 快捷方式(Shortcut)有什么区别。
一、什么是 Windows 快捷方式?
Windows 中,我们经常会在桌面看到这样的图标:
QQ.exe
QQ.exe - 快捷方式.lnk
双击快捷方式,实际上打开的是:
QQ.exe
快捷方式本身并不是程序,它只是保存了目标程序的位置。
如果把真正的 QQ 删除了,再双击快捷方式,就会提示找不到目标。
因此很多人第一次看到 Linux 的软链接时,会觉得这不就是快捷方式吗?
但只有一半是对的。
二、什么是 Linux 软链接?
Linux 中可以创建软链接:
ln -s a.txt b.txt
此时目录中会出现:
a.txt
b.txt -> a.txt
这里的 -> 表示:b.txt 指向 a.txt。
读取:
cat b.txt
实际上读取的是:
cat a.txt
执行:
./b.txt
实际上执行的是:
./a.txt
从使用体验来看,确实和 Windows 的快捷方式非常相似。
三、最大的区别:一个是文件系统功能,一个只是普通文件
这也是两者最本质的区别。
Windows 快捷方式
Windows 的快捷方式就是一个 .lnk 文件。
例如:
QQ.exe.lnk
对于 Windows 来说,它只是一个特殊格式的普通文件。
资源管理器认识它,所以双击可以打开目标程序。
但是很多命令行程序并不会自动解析 .lnk 文件。
例如:
copy
type
很多情况下处理的是快捷方式文件本身。
Linux 软链接
Linux 的软链接则完全不同。
它不是普通文件,它属于文件系统支持的一种特殊文件类型。
当任何程序打开一个软链接时:
程序
│
▼
soft-link
│
▼
真实文件
Linux 内核会自动找到真正的目标。
程序甚至不知道自己打开的是一个软链接。
例如:
cat hello-link.txt
cat 并不知道中间经过了一个软链接。
它看到的就是:
hello.txt
这一切都是内核自动完成的。
四、删除目标后的表现
假设:
a.txt
b.txt -> a.txt
删除:
rm a.txt
目录中仍然存在:
b.txt -> a.txt
但是:
cat b.txt
会提示:
No such file or directory
因为软链接只是保存了目标路径。
目标不存在了,它就成了一个悬空(损坏)软链接(Broken Symlink)。
Windows 的快捷方式也是类似的。
如果目标程序删除了,快捷方式仍然存在,只是打不开。
五、为什么 Linux 到处都是软链接?
很多人第一次查看 Linux 系统目录时,会发现大量软链接,例如:
/bin -> /usr/bin
/lib -> /usr/lib
/sbin -> /usr/sbin
还有:
/sbin/init
↓
/lib/systemd/systemd
为什么不直接复制一份文件?
原因是:兼容。
早期的软件一直使用:
/sbin/init
后来真正的程序变成了:
/lib/systemd/systemd
为了不修改所有旧程序,只需要建立一个软链接即可。
所有老程序仍然能够正常运行。
六、为什么 Linux 不用快捷方式?
因为 Linux 的软链接已经足够强大。
它直接由文件系统和内核支持。
任何程序:
- cp
- mv
- cat
- vim
- gcc
- Python
- Go
- Java
都能够自动识别软链接。
开发者不需要专门去处理。
而 Windows 的快捷方式更多是一种面向用户的功能,主要服务于桌面和资源管理器。
七、一张图理解二者的区别
Windows
QQ.exe.lnk
│
▼
资源管理器解析
│
▼
QQ.exe
Linux
soft-link
│
▼
Linux 内核自动解析
│
▼
真实文件
最大的区别就在于:
Windows 是应用程序(资源管理器)认识快捷方式;Linux 是操作系统内核认识软链接。