SHW*_*SHW 11 linux cd-command linux-kernel
在 Linux 中,每个实体都被视为文件。如果我这样做vim <cd-Name>,vim会将目录内容打开到它的编辑器中,因为它不区分文件和目录。
但是今天在工作的时候,遇到了一件事,很想知道。
我计划从嵌套目录中打开一个文件
vim a/b/c/d/file
Run Code Online (Sandbox Code Playgroud)
但是vim,我输入了
cd a/b/c/d/
Run Code Online (Sandbox Code Playgroud)
并点击TAB两次,但命令仅显示“d”目录的可用目录而不是文件。
难道cd命令不尊重“一切都是文件”吗?或者我错过了什么?
cha*_*aos 35
“一切都是文件”这句话定义了操作系统的架构。这意味着系统中的所有内容,包括进程、文件、目录、套接字、管道等,都由内核中的虚拟文件系统层抽象出的文件描述符表示。虚拟文件系统是内核提供的一个接口。因此这句话被更正为“一切都是文件描述符”。Linus Torvalds 本人再次更精确地更正了它:“一切都是字节流”。
但是,每个“文件”也有一个所有者和权限,您可能从常规文件和目录中知道。因此,经典的 Unix 工具,如 cat、ls、ps... 可以查询所有这些“文件”,并且不需要发明其他特殊机制,而不仅仅是使用read()系统调用的普通旧工具。例如,在 Microsoft 的操作系统系列中read(),任何文件类型都有多个不同的系统调用(我听说过大约 15 个),并且每个都略有不同。当一切都是一个文件时,你就不需要那个了。
对于您的问题:当然有不同的文件类型。在 linux 中有7 种文件类型。目录就是其中之一。但是,公用事业可以将它们彼此区分开来。例如,该cd命令的完整功能(当您按下 时TAB)仅列出目录,因为stat()系统调用(请参阅man 2 stat)返回一个带有名为 的字段的结构体st_mode。POSIX 标准定义了该字段可以包含的内容:
S_ISREG(m) is it a regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) socket? (Not in POSIX.1-1996.)
Run Code Online (Sandbox Code Playgroud)
该cd命令补全功能只是显示“文件”,其中S_ISDIR标志设置。