什么文件模式表明一个文件是符号链接(symlink)?
我的用例是检测 git 存储库(及其历史记录)内的符号链接。我的印象是符号链接之所以是符号链接是因为它的文件模式,而文件模式是工具chmod
设置的。
答案1
文件模式涵盖两个不同的概念:文件类型和文件权限。文件的模式由调用st_mode
结果中的值表示stat(2)
,并将ls -l
它们一起呈现;看了解 UNIX 权限和文件类型了解详情。
文件一旦创建,其类型就无法更改。此外,在 Linux 系统上,您无法指定符号链接的权限;重要的是目标的许可(实际上是完整模式,因为它也决定了符号链接的行为)。看文件权限如何应用于符号链接?了解详情。在 Mac OS X 上,符号链接可以拥有自己的权限。
最后,git
使用一个简化的模型,具有有限数量的可识别模式:
040000
对于一个目录100644
对于普通文件100755
对于可执行文件120000
对于符号链接
您可以使用以下命令查看这些值git cat-file -p 'master^{tree}'
:看专业版 Git了解详情。
答案2
什么文件模式表明一个文件是符号链接(symlink)?
检查文件是否为符号链接的 POSIX API 使用宏S_ISLNK
。
在glibc中,S_ISLNK
定义如下:
#define __S_IFMT 0170000 /* These bits determine file type. */
#define __S_IFLNK 0120000 /* Symbolic link. */
#define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask))
#define S_ISLNK(mode) __S_ISTYPE((mode), __S_IFLNK)
即文件是一个符号链接if ((mode & 0170000) == 0120000)
(至少在 GNU/Linux 上)。
答案3
符号链接(尽管某些文件系统以不同方式处理符号链接)是inode
指向与另一个文件(或目录)相同位置的表条目。
例如 if foo
is inode 1234
then bar
(指向 foo 的符号链接)是inode 1234
。
bar
并不真正存在它只是一个指向“真实”文件的指针。
Symlinks
通常没有它们指向的文件权限之外的权限。所以bar's
权限是“相同的” as foo's
。您不能bar
仅对foo
(真实文件)设置(符号链接)权限。
话虽如此,这是一个非常高层次的观点。不同的文件系统以不同的方式处理符号链接。不同的工具处理方式symlinks
不同。有些文件系统会“标记”symlinks
并专门处理它们,但有些则不会。
例如,chmod
onLinux
不会更改symlinks
权限,但 onOSX
您可以获取它。在这两种情况下,实际文件权限都会更改。
我想不出任何系统(并不意味着它不存在)其中 asymlink
具有与真实文件分开的权限。