Linux

一切都是文件?

  • August 26, 2015

在 Linux 中,每一個實體都被視為 FILE。如果我這樣做vim <cd-Name>vim會將目錄內容打開到它的編輯器中,因為它不區分文件和目錄。

但是今天在工作的時候,遇到了一件很想知道的事情。

我打算從嵌套目錄中打開一個文件

vim a/b/c/d/file

vim但我輸入的不是,而是

cd a/b/c/d/

並點擊TAB兩次,但命令只顯示“d”目錄的可用目錄而不是文件。

命令不cd尊重“一切都是文件”嗎?還是我錯過了什麼?

一切都是文件”片語定義了作業系統的體系結構。這意味著系統中的所有內容,包括程序、文件、目錄、套接字、管道……都由核心中虛擬文件系統層抽象的文件描述符表示。虛擬文件系統是核心提供的介面。因此,該片語被更正為“一切都是文件描述符”。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設置標誌的“文件”。

引用自:https://unix.stackexchange.com/questions/225537