一切都是文件?

一切都是文件?

在 Linux 中,每个实体都被视为文件。如果我vim <cd-Name>这样做,vim将在其编辑器中打开目录内容,因为它不区分文件和目录。

但今天工作的时候,我遇到了一件我很好奇的事情。

我计划从嵌套目录打开文件

vim a/b/c/d/file

vim我没有输入

 cd a/b/c/d/

并点击TAB两次,但命令仅显示“d”目录的可用目录而不是文件。

cd遵守命令”一切都是文件“?还是我遗漏了什么?

答案1

这 ”一切都是文件“这句话定义了操作系统的体系结构。这意味着系统中的所有内容(进程、文件、目录、套接字、管道……)都由通过抽象的文件描述符表示。虚拟文件系统内核层。虚拟文件系统是内核提供的接口。因此,该短语被更正为“一切都是文件描述符”。Linus Torvalds 自己又更正了一点,更准确地说:“一切都是字节流”。

然而,每个“文件”也有一个所有者和权限,您可以从常规文件和目录中知道。因此,像 cat、ls、ps 等经典的 Unix 工具可以查询所有这些“文件”,并且不需要发明其他特殊机制,而只是使用系统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.)

命令cd完成功能仅显示设置了标志的“文件” S_ISDIR

答案2

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

答案3

  1. cd是一个内置的bash.TAB完成是由 bash 选项控制的,您可以在/usr/share/bash-completion/bash_completion和中找到各种完成脚本/etc/bash_completion.dcd的完成方法在前一个中定义。由于cd仅适用于目录,因此很自然地仅列出可用目录。

  2. Linux 中一切都是文件。

相关内容