Чому кореневий каталог позначається знаком a /?


95

Я зробив кілька досліджень з цього приводу в Google, але результати були помутнілими. Чому /знак використовується для позначення кореневого каталогу. Чи є якісь вагомі причини цього?


12
Причина полягає в тому, що '/' - це роздільник каталогів, і хоча сам кореневий каталог є безіменним, так само, як cd /homeрівнозначне cd /home/додаванню /в кінці порожнього імені, забезпечує доступ до цього каталогу.
СФ.

2
Чи читали ви це: en.wikipedia.org/wiki/Root_directory ?
Kevdog777

11
Це безіменно, тому що, якщо дивитися зсередини, це межа видимого дерева каталогів. Видима ієрархія каталогів може бути просто піддією в більшій ієрархії, як, наприклад, коли пошукові імена шляхів були змінені за допомогою chroot()виклику, але при перегляді зсередини це абстрагується.
Томас Найман

14
Тому що порожній рядок був би жахливим вибором!
Бакуріу

3
На додаток до зазначеного, використання / для позначення кореня дає певні побічні ефекти з точки зору абсолютних та відносних назв шляху. /some/dirЗАВЖДИ означає , в (root)/some/dirтой час як some/dirзавжди щодо поточного робочого каталогу. Цей принцип можна також перенести на використання веб-URL-адрес.
Tor Valamo

Відповіді:


108

Поперечна косою рисою /є розмежуючим символом, який розділяє каталоги на шляхи в Unix-подібних операційних системах. Цей персонаж, схоже, був обраний десь у 70-х роках, і, згідно з анекдотичними джерелами , причини можуть бути пов’язані з тим, що попередник Unix, операційної системи Multics , використовував цей >персонаж як роздільник шляху, але дизайнери Unix вже зарезервували символів >і <означати перенаправлення вводу / виводу в командному рядку оболонки задовго до того, як у них була багаторівнева файлова система. Тож, коли прийшов час проектувати файлову систему, їм довелося знайти іншого символу для позначення розділення елементів імені шляху.

Тут слід зауважити, що у терміналі Lear-Siegler ADM-3A, що використовується загалом у 1970-х, з якого, крім іншого, бере початок практика використання ~символу для представлення домашнього каталогу , /ключ знаходиться поруч із >ключем:

розкладка клавіатури терміналу Lear-Siegler ADM-3A

Що стосується того, чому кореневий каталог позначається єдиним /, на це умова, швидше за все, впливає той факт, що кореневий каталог - це каталог верхнього рівня ієрархії каталогів, і хоча інші каталоги можуть знаходитись під ним, зазвичай немає t причина для посилання на що-небудь поза кореневим каталогом. Аналогічно сам запис каталогу не має імені, оскільки це межа дерева видимого каталогу.


2
"хоча інші каталоги можуть знаходитися під ним, зазвичай немає причин звертатися до чогось поза кореневим каталогом." Я цього не розумію. Я не впевнений, в якому напрямку ви маєте на увазі під «знизу», але нічого «поза» ієрархії не встановлено /. Файлові системи Unix - це єдине дерево, з точками кріплення для різних дисків.
alexis

4
Є також chrootі таке - ви не можете отримати доступ ні до чого, крім нового кореня, але це не означає, що їх там немає.
Бобсон

1
@Gilles, фізичне розташування накопичувача не питання. У цьому сенсі будь-який розділ диска знаходиться поза кореневим розділом, але він встановлений під коренем у ієрархії файлової системи. Бобсон, хороша думка про chroot, але це не відповідає тому, що сказав Томас: Після chroot це не те, що "зазвичай немає причини" виходити за межі системного кореня; це неможливо. У Unix все у файловій системі знаходиться під коренем.
alexis

1
"Після chroot - це не те, що" зазвичай немає причини "виходити за межі кореневої системи; це неможливо". Це явно неправильно. У той час, коли він chroot()був представлений, він взагалі не мав ув'язнених властивостей , це лише впливало на дозвіл назви шляху. Навіть сьогодні привілейовані процеси можуть вибухнути з хронічного дизайну . Я також згадував chroot()у попередньому коментарі .
Thomas Nyman

4
IIRC, конвенція Multics використовується не тільки >як роздільник каталогів, але і <для посилання на батьківський каталог: <сам по собі був еквівалентний .., а <fooеквівалентний ../foo. Я завжди вважав це естетично приємним.
Марк Рід

55

Перша ієрархічна файлова система, як ми її знаємо сьогодні, була розроблена для Multics . Конструкція описана у «Загальній файловій системі загального призначення для вторинного зберігання» RC Daley та PG Neumann. Характерною характеристикою цієї файлової системи є те, що каталог - це файл, який може міститися в каталозі, як і будь-який інший файл. Структура файлу утворює дерево, в якому всі нелистові вузли - це каталоги. Корінь дерева - це завжди каталог. Кожен файл має ім'я (ім'я запису ), яке є унікальним у його батьківському каталозі. У кореневому каталозі немає імені, оскільки він не міститься в іншому каталозі.

Для того щоб позначити файл, потрібно описати шлях від кореня дерева. Multics прийняв природний синтаксис для імен шляхів, де якщо Pце шлях до каталогу і Fє ім'ям файлу, то це синтаксис для файла, який називається всередині каталогу, шлях якого є .P>FFP

У ті часи, коли ви не хочете обтяжувати себе каталогами, мультимедіа мали поняття робочого каталогу . Голе ім’я файлу без вказівки каталогів інтерпретується як файл у робочому каталозі.

Поєднуючи ці правила, foo- це файл у робочому каталозі; foo>bar- це файл у дочірньому каталозі fooробочого каталогу тощо. Ці правила описують відносні шляхи, але для створення абсолютних шляхів, починаючи від кореневого каталогу, потрібно додаткове правило. Зважаючи на те, що читання назви шляху зліва направо відповідає переміщенню від кореня до листя дерева, корінь повинен бути позначений спеціальним маркером зліва від імені шляху. Оскільки імена файлів ніколи не бувають порожніми (оскільки це часто бентежить), жодне відносне ім'я шляху ніколи не починається з символу >, що робить його зручним маркером для абсолютних імен шляху. Таким чином >foo, файл, який називається fooв кореневому каталозі, >foo>barназивається файлом, який називається barв каталозіfooв кореневому каталозі тощо. Це залишає кореневий каталог, який може бути порожнім рядком; однак, часто не зручно використовувати порожній рядок як ім'я шляху, тому натомість він записується >, що має додаткову перевагу, що ім'я контуру є абсолютним, якщо і лише якщо його першим символом є >.

Unix прийняла цей дизайн від Multics. Оскільки Unix вже використовував символ >для перенаправлення виводу у своїй командній оболонці, його дизайнери обрали інший символ /для розділення каталогів у назвах шляхів.


11

У компонентах імені шляху в Unix не можна використовувати лише два символи: нульовий символ, який закінчує рядки на C (мова ядра), і косу рису, яка зарезервована як роздільник шляху. Крім того, компоненти контуру не можуть бути порожніми рядками.

Отже, у назві контуру ми маємо лише два види жетонів: косою рисою та складовою.

Припустимо, що, не додаючи жодних нових лексем , ми хотіли б підтримувати підтримку двох типів шляхів, відносної та абсолютної. Крім того, ми хотіли б мати можливість посилатися на кореневий каталог, який не має імені (у нього немає батька, який би дав йому ім'я).

Як ми можемо представити відносні шляхи, абсолютні шляхи та посилатися на кореневий каталог, використовуючи лише косу рису?

Найбільш очевидний спосіб розширення мови (крім введення нового лексеми) - це створення нового синтаксису: надайте нового значення комбінаціям лексем, які є недійсним синтаксисом.

Шляхи, які починаються з косої риски, не мають сенсу, тому чому б не використовувати провідну косу рису в якості маркера, який вказує "цей шлях є абсолютним, а не відносним".

Шлях, який не містить нічого, крім косої риски, також недійсний, тому чому б не призначити йому значення "кореневий каталог".

Ці два значення пов'язані між собою, оскільки абсолютний шлях починає пошук у кореневій директорії. Іншими словами, провідну косу рису можна вважати таким, що має значення:

  • перейдіть до кореневого каталогу та споживайте символ косої риски.
  • якщо на шляху є більше матеріалу, обробіть його як відносний шлях, інакше ви закінчите.

Тоді ми можемо також кинути в косу рису, що може означати, що "цей шлях стверджує, що останній компонент шляху - це ім'я каталогу, а не звичайний файл або будь-який інший тип об'єкта: цей треш-косої риси позначає цей каталог аналогічно до те, як ведуча коса риса позначає кореневу директорію. "

При всьому цьому вище синтаксисі ми все ще маємо синтаксис із непризначеним значенням: подвійні косої риски, потрійні косої риски тощо.

Чому б просто не ввести ще один маркер і зробити це по-іншому. Це, мабуть, тому, що дизайнери взагалі застосовували мінімалістичні підходи. (Чому edредактор відображає лише a, ?коли ви щось зробили не так?) Нахил косих просто набирається, не вимагаючи змін. Мова шляху лише з двома типами токенів (компонент і косою рисою) легко запам'ятовується та використовується.

Ще одне важливе враження полягає в тому, що прості маніпуляції з шляхами можливі, використовуючи лише рядкові представлення. Наприклад, ми можемо досить легко «відновити» абсолютні шляхи до нового батьківського каталогу:

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

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

Це не спрацює, якби ми вказали абсолютні шляхи якось іншим способом, наприклад, провідним знаком долара чи будь-яким іншим:

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#^}"

Цей тип кодування все ще потрібен у деяких випадках при роботі зі шляхами у стилі Unix, але їх менше.


8
"Косою рисою легко набрати, не вимагаючи змін." Можливо, вам легко виїхати туди через ставок, але тут, у Фінляндії, ми не тільки повинні натиснути зсув, але й охопити всі поперек до ряду чисел . ; P
Thomas Nyman

1
@ThomasNyman Як би це не було, іноземні розкладки клавіатур, ймовірно, не хвилювали Кена Томпсона. Косою рисою було легко набрати для розробників Unix та їхніх ранніх користувачів.
Каз

1
Досить справедливо. Хоча я здебільшого жартував, мені здається цікавим (а іноді і кумедним), як деякі особливості програмного забезпечення з довгим спадщиною можна пояснити особливостями сучасного обладнання .
Томас Найман

@ThomasNyman Ха-ха, мені цікаво, чи сам Білл Джой увійде та оновить деталі, необхідні для цитування, на цій сторінці ADM-3A, чи буде якийсь "Вікідекхед", а потім суперечить: "Ця стаття містить оригінальні дослідження". :)
Каз

@ThomasNyman, тепер я вважаю, що є "педальні" клавіатури, за допомогою яких можна набрати /праву ногу. Так само, як грати на піаніно.
Pacerier
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.