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.