Почему корневой каталог обозначен знаком /?

95

Я провел некоторые исследования по этому поводу в Google, но результаты были облачными. Почему /знак используется для обозначения корневого каталога. Есть ли за этим веские причины?

Рубан Савви
источник
12
Причина в том, что «/» является разделителем каталогов, и хотя сам корневой каталог является безымянным, равно как cd /homeи cd /home/добавление /в конце пустого имени, обеспечивает доступ к этому каталогу.
SF.
2
Вы читали это: en.wikipedia.org/wiki/Root_directory ?
Kevdog777
11
Он безымянный, потому что при взгляде изнутри он является границей видимого дерева каталогов. Видимая иерархия каталогов может быть просто поддеревом в большей иерархии, например, когда поиск путей был изменен посредством chroot()вызова, но при просмотре изнутри это абстрагируется.
Томас Найман
14
Потому что пустая строка была бы ужасным выбором!
Бакуриу
3
В дополнение к тому, что упомянуто, использование / для обозначения корня дает определенные побочные эффекты с точки зрения абсолютных и относительных имен путей. /some/dirВСЕГДА означает, что (root)/some/dirвремя some/dirвсегда относительно текущего рабочего каталога. Этот принцип также переносится на использование веб-URL.
Тор Валамо

Ответы:

108

Косая черта /- это символ-разделитель, который разделяет каталоги по путям в Unix-подобных операционных системах. Этот символ, кажется, был выбран где-то в 1970-х годах, и, согласно неподтвержденным источникам , причины могут быть связаны с тем, что предшественник Unix, операционной системы Multics , использовал этот >символ в качестве разделителя пути, но разработчики Unix уже зарезервировали символы >и <обозначают перенаправление ввода / вывода в командной строке оболочки задолго до того, как они имели многоуровневую файловую систему. Поэтому, когда пришло время проектировать файловую систему, они должны были найти другой символ, чтобы обозначить разделение элемента pathname.

Здесь следует отметить, что в терминале Lear-Siegler ADM-3A, который широко использовался в 1970-х годах, из которого, помимо прочего, возникает практика использования ~символа для представления домашнего каталога , /ключ находится рядом с >ключом:

раскладка клавиатуры терминала Lear-Siegler ADM-3A

Что касается того, почему корневой каталог обозначается одним /, это соглашение, скорее всего, зависит от того факта, что корневой каталог является каталогом верхнего уровня иерархии каталогов, и, хотя другие каталоги могут находиться под ним, обычно нет причина ссылаться на что-либо за пределами корневого каталога. Точно так же сама запись каталога не имеет имени, потому что это граница видимого дерева каталогов.

Томас Найман
источник
2
«в то время как другие каталоги могут быть ниже, обычно нет причин ссылаться на что-либо вне корневого каталога». Я не понимаю этого. Я не уверен, в каком направлении вы подразумеваете «под», но нет ничего «вне» иерархии, на которой установлен /. Файловые системы Unix представляют собой единое дерево с точками монтирования для различных дисков.
Алексис
4
Также есть chrootи такие - вы не можете получить доступ ни к чему, кроме нового корня, но это не значит, что их там нет.
Бобсон
1
@ Жиль, физическое местонахождение диска не вопрос. В этом смысле любой раздел диска находится вне корневого раздела, но он монтируется под root в иерархии файловой системы. Бобсон, хорошее замечание о chroot, но это не соответствует тому, что сказал Томас: после chroot вовсе не так, что «обычно нет причины» выходить за пределы системного корня; это невозможно. В Unix все в файловой системе находится под root.
Алексис
1
«После chroot это не так, что« обычно нет причины »выходить за пределы системного корня; это невозможно». Это совершенно неправильно. В то время, когда он chroot()был представлен, у него не было джейл-подобных свойств , он просто влиял на разрешение имен путей. Даже сегодня привилегированные процессы могут выйти из-под контроля по замыслу . Я также упоминал chroot()в предыдущем комментарии .
Томас Найман
4
IIRC, соглашение Multics не только используется >в качестве разделителя каталогов, но и <для ссылки на родительский каталог: <само по себе было эквивалентно .., в то время как <fooбыло эквивалентно ../foo. Я всегда находил это эстетически приятным.
Марк Рид
55

Первая иерархическая файловая система, как мы ее знаем сегодня, была разработана для Multics . Конструкция описана в «Файловой системе общего назначения для вторичного хранения» Р. К. Дейли и П. Г. Неймана. Характерной особенностью этой файловой системы является то, что каталог - это файл, который может содержаться в каталоге, как и любой другой файл. Структура файла формирует дерево, в котором все неконечные узлы являются каталогами. Корнем дерева всегда является каталог. Каждый файл имеет имя (имя записи ), которое является уникальным в его родительском каталоге. Корневой каталог не имеет имени, поскольку он не содержится в другом каталоге.

Чтобы назначить файл, вам нужно описать путь от корня дерева. Multics принял естественный синтаксис для имен путей, где, если Pэто путь к каталогу и Fимя файла, то это синтаксис для файла, вызываемого внутри каталога, путь к которому .P>FFP

В те времена, когда вы не хотите обременять себя каталогами, у Multics было понятие « рабочий каталог» . Пустое имя файла без указания каталога интерпретируется как файл в рабочем каталоге.

Комбинируя эти правила, fooэто файл в рабочем каталоге; foo>barфайл в дочернем каталоге fooрабочего каталога и т. д. Эти правила описывают относительные пути, но для построения абсолютных путей требуется дополнительное правило, начиная с корневого каталога. Учитывая, что чтение имени пути слева направо соответствует перемещению от корня к листьям дерева, корень должен быть указан специальным маркером слева от имени пути. Так как имена файлов никогда не бывают пустыми (потому что это часто сбивает с толку), относительное имя пути никогда не начинается с символа >, что делает его удобным маркером для имен абсолютных путей. Таким образом, >fooфайл называется fooв корневом каталоге, >foo>barэто файл называется barв каталоге с именемfooв корневом каталоге и так далее. Это оставляет корневой каталог, который может быть пустой строкой; однако часто не удобно использовать пустую строку в качестве имени пути, поэтому вместо этого она записывается >, что дает дополнительное преимущество, заключающееся в том, что имя пути является абсолютным тогда и только тогда, когда его первый символ является >.

Unix принял этот дизайн от Multics. Поскольку Unix уже использовал символ >для перенаправления вывода в своей командной оболочке, его разработчики выбрали другой символ /для разделения каталогов в именах путей.

жилль
источник
11

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

Таким образом, в имени пути у нас есть только два вида токенов: косая черта и компонент.

Предположим, что без добавления каких-либо новых токенов мы хотели бы поддержать поддержку двух типов путей, относительных и абсолютных. Кроме того, мы хотели бы иметь возможность ссылаться на корневой каталог, у которого нет имени (у него нет родителя, который бы дал ему имя).

Как мы можем представлять относительные пути, абсолютные пути и ссылаться на корневой каталог, используя только косую черту?

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

Пути, начинающиеся с косой черты, не имеют смысла, поэтому почему бы не использовать начальную косую черту в качестве маркера, который указывает «этот путь является абсолютным, а не относительным».

Путь, который не содержит ничего, кроме косой черты, также недопустим, так почему бы не присвоить ему значение «корневой каталог».

Эти два значения связаны друг с другом, потому что абсолютный путь начинается с поиска в корневом каталоге. Другими словами, начальная косая черта может рассматриваться как имеющая значение:

  • перейдите в корневой каталог и используйте символ косой черты.
  • если на пути больше материала, то обработайте его как относительный путь, иначе все готово.

Затем мы могли бы также добавить завершающую косую черту, что может означать, что «этот путь утверждает, что последний компонент пути - это имя каталога, а не обычный файл или объект любого другого типа: этот конечный слеш обозначает этот каталог аналогично способ, которым начальная косая черта обозначает корневой каталог. "

При всем вышеприведенном синтаксисе у нас все еще есть синтаксис с неназначенным значением: двойная косая черта, тройная косая черта и так далее.

Почему бы просто не ввести другой токен и сделать это по-другому. Вероятно, это связано с тем, что дизайнеры использовали минималистичные подходы в целом. (Почему edредактор отображает только, ?когда вы делаете что-то не так?) Косую черту легко набрать, не требуя сдвига. Язык путей только с двумя типами токенов (компонент и слеш) легко запомнить и использовать.

Другое важное соображение заключается в том, что простые манипуляции с путями возможны с использованием только строковых представлений. Например, мы можем довольно легко «перекоренить» абсолютные пути к новому родительскому каталогу:

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, но его меньше.

Kaz
источник
8
«Косую черту легко набрать, не требуя сдвига». Может быть, вы легко доберетесь туда через пруд, но здесь, в Финляндии, нам не только нужно нажимать клавишу Shift, но и дойти до всех рядов . ; P
Томас Найман
1
@ThomasNyman Как бы то ни было, иностранные раскладки клавиатуры, вероятно, не были проблемой для Кена Томпсона. Слэш было легко напечатать для разработчиков Unix и их ранних пользователей.
Каз
1
Справедливо. Хотя я в основном шутил, мне действительно интересно (и иногда забавно), как некоторые особенности в программном обеспечении с давним наследием можно объяснить особенностями современного аппаратного обеспечения .
Томас Найман
@ThomasNyman Ха-ха, мне интересно, если сам Билл Джой войдет в систему и обновит {citation-required} части на этой странице ADM-3A, будет ли какой-то «Wikidickhead» затем возразить: «Эта статья содержит оригинальные исследования». :)
Каз
@ThomasNyman, теперь я считаю, что есть «педальные» клавиатуры, с помощью которых вы можете печатать /правой ногой. Как играть на пианино.
Pacerier