GNU/Linux >> Znalost Linux >  >> Linux

Proč je kořenový adresář označen znakem /?

Lomítko / je oddělovací znak, který odděluje adresáře v cestách v operačních systémech podobných Unixu. Zdá se, že tato postava byla vybrána někdy v 70. letech 20. století a podle neoficiálních zdrojů mohou důvody souviset s tím, že předchůdce Unixu, operační systém Multics, používal > znak jako oddělovač cesty, ale návrháři Unixu si již vyhradili znaky > a < znamenat přesměrování I/O na příkazovém řádku shellu ještě předtím, než měli víceúrovňový souborový systém. Takže když přišel čas navrhnout souborový systém, museli najít jiný znak, který by znamenal oddělení elementů cesty.

Zde je třeba poznamenat, že v terminálu Lear-Siegler ADM-3A běžně používaném v 70. letech 20. století, z něhož mimo jiné vyplývá praxe používání ~ znak reprezentující původ domovského adresáře, / klíč je vedle > klíč:

Pokud jde o to, proč je kořenový adresář označen jedním / , je to konvence s největší pravděpodobností ovlivněná skutečností, že kořenový adresář je adresářem nejvyšší úrovně v hierarchii adresářů, a zatímco jiné adresáře mohou být pod ním, obvykle není důvod odkazovat na cokoli mimo kořenový adresář. . Podobně i samotný záznam adresáře nemá žádné jméno, protože je to hranice viditelného adresářového stromu.


První hierarchický souborový systém, jak jej známe dnes, byl navržen pro Multics. Návrh je popsán v „A General-Purpose File System For Secondary Storage“ od R.C. Daley a P.G. Neumann. Charakteristickým znakem tohoto souborového systému je, že adresář je soubor, který může být obsažen v adresáři jako jakýkoli jiný soubor. Struktura souborů tvoří strom, ve kterém jsou všechny nelistové uzly adresáře. Kořenem stromu je vždy adresář. Každý soubor má jméno (název položky), které je v rámci svého nadřazeného adresáře jedinečné. Kořenový adresář nemá jméno, protože není obsažen v jiném adresáři.

Abyste mohli označit soubor, musíte popsat cestu z kořene stromu. Multics přijal přirozenou syntaxi pro názvy cest, kde if P je cesta k adresáři a F je název souboru, potom P>F je syntaxe souboru s názvem F uvnitř adresáře, jehož cesta je P .

Pro ty časy, kdy se nechcete zatěžovat adresáři, měl Multics pojem pracovní adresář. Holý název souboru bez označení adresáře je interpretován jako soubor v pracovním adresáři.

Kombinací těchto pravidel foo je soubor v pracovním adresáři; foo>bar je soubor v podřízeném adresáři foo pracovního adresáře a tak dále. Tato pravidla popisují relativní cesty, ale k sestavení absolutních cest počínaje kořenovým adresářem je zapotřebí doplňkové pravidlo. Vzhledem k tomu, že čtení názvu cesty zleva doprava odpovídá přesunu od kořene k listům stromu, měl by být kořen označen speciální značkou nalevo od názvu cesty. Protože názvy souborů nejsou nikdy prázdné (protože by to bylo často matoucí), žádná relativní cesta nikdy nezačíná znakem > , což z něj dělá pohodlnou značku pro absolutní názvy cest. Tedy >foo je soubor nazvaný foo v kořenovém adresáři >foo>bar je soubor nazvaný bar v adresáři s názvem foo v kořenovém adresáři a tak dále. Tím zůstane kořenový adresář, což může být prázdný řetězec; často však není vhodné použít prázdný řetězec jako cestu, takže se místo toho zapíše > , což má další výhodu v tom, že název cesty je absolutní tehdy a jen tehdy, když je jeho první znak > .

Unix převzal tento design z Multics. Protože Unix již používal znak > pro přesměrování výstupu v jeho příkazovém prostředí zvolili jeho návrháři jiný znak / k oddělení adresářů v názvech cest.


V komponentách názvů cest na Unixu nesmí být použity pouze dva znaky:znak null, který ukončuje řetězce v C (jazyk jádra) a lomítko, které je vyhrazeno jako oddělovač cesty. Komponenty cesty navíc nemohou být prázdné řetězce.

Takže v názvu cesty máme pouze dva druhy tokenů:lomítko a komponentu.

Předpokládejme, že bez přidání nových tokenů , rádi bychom podporovali dva typy cest, relativní a absolutní. Dále bychom chtěli mít možnost odkazovat na kořenový adresář, který nemá žádné jméno (nemá žádného rodiče, který by mu dal jméno).

Jak můžeme reprezentovat relativní cesty, absolutní cesty a odkazovat na kořenový adresář pouze pomocí lomítka?

Nejviditelnější způsob, jak rozšířit jazyk (jiný než zavedení nového tokenu), je vytvořit novou syntaxi:dát nový význam kombinacím tokenů, které jsou neplatnou syntaxí.

Cesty, které začínají lomítkem, nedávají smysl, tak proč nepoužít úvodní lomítko jako značku, která označuje „tato cesta je absolutní, spíše než relativní“.

Cesta, která neobsahuje nic jiného než lomítko, je také neplatná, tak proč jí nepřiřadit význam "kořenový adresář".

Tyto dva významy se spojují, protože absolutní cesta začíná hledáním v kořenovém adresáři. Jinými slovy, úvodní lomítko lze považovat za mající význam:

  • přejděte do kořenového adresáře a použijte znak lomítka.
  • pokud je v cestě více materiálu, zpracujte jej jako relativní cestu, jinak je hotovo.

Pak bychom mohli také přidat koncové lomítko, což může znamenat „tato cesta tvrdí, že poslední komponenta cesty je název adresáře spíše než běžný soubor nebo jakýkoli jiný typ objektu:toto koncové lomítko označuje tento adresář podobně jako způsob, jakým úvodní lomítko označuje kořenový adresář."

Se všemi výše uvedenými syntaxemi stále máme syntaxi s nepřiřazeným významem:dvojitá lomítka, trojitá lomítka a tak dále.

Proč prostě nezavést další token a neudělat to jinak. Je to pravděpodobně proto, že designéři obecně zvolili minimalistické přístupy. (Proč ed editor zobrazí pouze ? když uděláte něco špatně?) Lomítko se píše snadno a nevyžaduje žádný posun. Jazyk cesty s pouze dvěma typy tokenů (komponenta a lomítko) se snadno pamatuje a používá.

Dalším důležitým aspektem je, že je možná snadná manipulace s cestami pouze pomocí řetězcových reprezentací. Můžeme například "re-root" absolutní cesty k novému nadřazenému adresáři docela snadno:

OLD_PATH=/old/path
NEW_HOME=/new/home

NEW_PATH="$NEW_HOME$OLD_PATH"  /new/home/old/path

To by nefungovalo, kdybychom absolutní cesty označili jiným způsobem, například znakem dolaru nebo čímkoli jiným:

OLD_PATH=^old/path  # ^ means absolute path
NEW_HOME=^new/home

# now we need more string kung-fu than just catenation
NEW_PATH="$NEW_HOME/${OLD_PATH#^}"

Tento typ kódování je stále potřeba v některých případech při práci s cestami ve stylu Unixu, ale je ho méně.


Linux
  1. Nepodařilo se podepsat Csr pomocí kořenového klíče Ca?

  2. Linux – Proč je kořenový adresář označen A / Sign?

  3. Vysvětlení adresáře /etc/sysconfig

  1. Vypsáno jádro, ale soubor jádra není v aktuálním adresáři?

  2. Jak změním kořenový adresář serveru Apache?

  3. Proč je příšerné 'rm -rf /' vůbec povoleno?

  1. Jak mohu najít nejstarší soubor ve stromu adresářů

  2. Proč se heslo 'sudo' liší od hesla 'su root'

  3. Proč nemohu tento soubor smazat jako root?