V Linuxu je každá jednotlivá entita považována za SOUBOR. Pokud udělám vim <cd-Name>
pak vim
otevře obsah adresáře do svého editoru, protože nerozlišuje mezi souborem a adresářem.
Ale dnes jsem při práci narazil na věc, o které jsem zvědavý.
Plánoval jsem otevřít soubor z vnořeného adresáře
vim a/b/c/d/file
Ale místo vim
, napsal jsem
cd a/b/c/d/
a stiskněte TAB dvakrát, ale příkaz zobrazoval pouze dostupný adresář adresáře „d“, nikoli soubory.
Nepoužívejte cd
příkaz honor „všechno je soubor “? Nebo mi něco uniká?
Přijatá odpověď:
„Vše je soubor “ fráze definuje architekturu operačního systému. To znamená, že vše v systému od procesů, souborů, adresářů, soketů, rour, … je reprezentováno deskriptorem souboru abstrahovaným přes vrstvu virtuálního souborového systému v jádře. Virtuální souborový systém je rozhraní poskytované jádrem. Proto byla fráze opravena na „Všechno je deskriptor souboru “. Sám Linus Torvalds to opravil opět o něco přesněji:„Všechno je proud bajtů “.
Každý „soubor“ má však také vlastníka a oprávnění, která můžete znát z běžných souborů a adresářů. Klasické unixové nástroje jako cat, ls, ps, … se tedy mohou dotazovat na všechny tyto „soubory“ a není třeba vymýšlet další speciální mechanismy, než jen obyčejné staré nástroje, které všechny používají read()
systémové volání. Například v rodině operačních systémů Microsoft existuje několik různých read()
systémová volání (slyšel jsem asi 15) pro všechny typy souborů a každé z nich je trochu jiné. Když je všechno soubor, pak to nepotřebujete.
Na vaši otázku :Samozřejmě existují různé typy souborů . V linuxu existuje 7 typů souborů. Adresář je jedním z nich. Obslužné programy je však dokážou od sebe odlišit. Například kompletní funkce cd
příkaz (když stisknete TAB ) uvádí pouze adresáře, protože stat()
systémové volání (viz man 2 stat
) vrací strukturu s polem nazvaným st_mode
. Standard POSIX definuje, co může toto pole obsahovat:
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
funkce dokončení příkazu pouze zobrazí „soubory“, kde je S_ISDIR
příznak je nastaven.