在 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
cd
是一个内置的bash
.TAB
完成是由 bash 选项控制的,您可以在/usr/share/bash-completion/bash_completion
和中找到各种完成脚本/etc/bash_completion.d
。cd
的完成方法在前一个中定义。由于cd
仅适用于目录,因此很自然地仅列出可用目录。Linux 中一切都是文件。