一切都是文件?

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标志设置。


sas*_*ang 6

您的 shell 足够聪明,知道它cd不适用于文件参数。因此,当您点击tab它时,它只会显示该目录中适用于cd.