最近我在Python中遇到了os
库,并发现了符号链接的存在。我想知道符号链接是什么,为什么它存在,以及它的各种用途是什么?
一般来说,在Linux中,所有内容都被视为文件。目录是包含从名称(路径)到inode的映射的文件,后者只是驻留在系统中的不同对象的唯一标识符。基本上,如果我给你一个名称,例如/home/gst/mydog.png
,访问过程将首先查看/
目录(根目录),在其中找到有关如何找到home
的信息,然后打开该文件,查看其中是否存在gst
,最后在该文件中尝试查找mydog.png
的位置,并在成功后尝试执行其既定任务。回到目录文件,它们包含的映射称为链接
。这就带我们来到硬链接和符号链接。
硬链接只是像我们之前讨论的那样的映射。它直接指向特定对象。另一方面,符号链接并不直接指向一个对象。相反,它只是保存了一个对象的路径。例如,假设我在/home/gst/Desktop/mycat.png
处创建了一个到/home/gst/mydog.png
的符号链接,并使用os.symlink("/home/gst/mydog.png", "/home/gst/Desktop/mycat.png")
。当我尝试打开它时,通常会将名称/home/gst/Desktop/mycat.png
解析为/home/gst/mydog.png
。通过跟随位于/home/gst/Desktop/mycat.png
的符号链接,我实际上(尝试)访问由/home/gst/mydog.png
指向的对象。
如果我创建一个硬链接(例如通过调用os.link
),我只需将条目添加到相关目录文件中,以便可以按名称跟随到链接的对象。当我创建符号链接时,我创建了一个文件,其中包含指向另一个文件的路径(可能是另一个符号链接)。
/home/gst/Desktop/mycat.png
传递给os.readlink
,它将返回/home/gst/mydog.png
。当调用os
中的函数并将(可选)参数follow_symlinks
设置为True
时,也会发生这种名称解析,但是,如果它设置为False
,则名称不会被解析(例如,当您想要操作符号链接本身而不是它指向的对象时,您会将其设置为false)。来自模块文档:
不跟随符号链接:如果follow_symlinks为
False
,并且要操作的路径的最后一个元素是符号链接,则该函数将操作符号链接本身,而不是链接指向的文件。(对于POSIX系统,Python将调用该函数的l...
版本。)您可以使用os.supports_follow_symlinks检查您的平台是否支持follow_symlinks。如果不可用,则使用它将引发NotImplementedError。
/home/gst/fs1
),数据组织和解释的方式可能与其他地方(比如/home/gst/Desktop/fs2
)不同。硬链接只能存在于与其所指向的文件相同的文件系统上。而符号链接可以在一个文件系统上创建,但实际上指向另一个文件系统上的文件(参见这个问题的答案)。