In Linux, ogni singola entità è considerata FILE. Se faccio vim <cd-Name>
quindi, vim
aprirà il contenuto della directory nel suo editor, perché non fa distinzione tra file e directory.
Ma oggi, mentre lavoro, mi sono imbattuto in una cosa di cui sono curioso di sapere.
Ho pianificato di aprire un file dalla directory nidificata
vim a/b/c/d/file
Ma invece di vim
, ho digitato
cd a/b/c/d/
e premi il TAB due volte, ma il comando mostrava solo la directory disponibile della directory "d" anziché i file.
Non il cd
command honor “tutto è un file “? O mi sfugge qualcosa?
Risposta accettata:
Il "Tutto è un file ” frase definisce l'architettura del sistema operativo. Significa che tutto nel sistema da processi, file, directory, socket, pipe, ... è rappresentato da un descrittore di file astratto sul livello del filesystem virtuale nel kernel. Il filesystem virtuale è un'interfaccia fornita dal kernel. Quindi la frase è stata corretta per dire "Tutto è un descrittore di file “. Linus Torvalds stesso lo ha corretto ancora un po' più precisamente:“Tutto è un flusso di byte “.
Tuttavia, ogni "file" ha anche un proprietario e autorizzazioni che potresti conoscere da normali file e directory. Pertanto i classici strumenti Unix come cat, ls, ps, ... possono interrogare tutti quei "file" e non è necessario inventare altri meccanismi speciali, oltre ai semplici vecchi strumenti, che usano tutti read()
chiamata di sistema. Ad esempio, nella famiglia di sistemi operativi Microsoft ci sono più read()
chiamate di sistema (ne ho sentito parlare di 15) per qualsiasi tipo di file e ognuna di esse è leggermente diversa. Quando tutto è un file, non ne hai bisogno.
Alla tua domanda :Ovviamente ci sono diversi tipi di file . In Linux ci sono 7 tipi di file. La directory è una di queste. Ma le utilità possono distinguerli l'uno dall'altro. Ad esempio, la funzione completa del cd
comando (quando si preme TAB ) elenca solo le directory, perché stat()
chiamata di sistema (vedi man 2 stat
) restituisce una struttura con un campo chiamato st_mode
. Lo standard POSIX definisce cosa può contenere quel campo:
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.)
Il cd
la funzione di completamento del comando mostra solo "file" dove S_ISDIR
il flag è impostato.