Я провел некоторые исследования по этому поводу в Google, но результаты были облачными. Почему /
знак используется для обозначения корневого каталога. Есть ли за этим веские причины?
linux
directory-structure
history
Рубан Савви
источник
источник
cd /home
иcd /home/
добавление/
в конце пустого имени, обеспечивает доступ к этому каталогу.chroot()
вызова, но при просмотре изнутри это абстрагируется./some/dir
ВСЕГДА означает, что(root)/some/dir
времяsome/dir
всегда относительно текущего рабочего каталога. Этот принцип также переносится на использование веб-URL.Ответы:
Косая черта
/
- это символ-разделитель, который разделяет каталоги по путям в Unix-подобных операционных системах. Этот символ, кажется, был выбран где-то в 1970-х годах, и, согласно неподтвержденным источникам , причины могут быть связаны с тем, что предшественник Unix, операционной системы Multics , использовал этот>
символ в качестве разделителя пути, но разработчики Unix уже зарезервировали символы>
и<
обозначают перенаправление ввода / вывода в командной строке оболочки задолго до того, как они имели многоуровневую файловую систему. Поэтому, когда пришло время проектировать файловую систему, они должны были найти другой символ, чтобы обозначить разделение элемента pathname.Здесь следует отметить, что в терминале Lear-Siegler ADM-3A, который широко использовался в 1970-х годах, из которого, помимо прочего, возникает практика использования
~
символа для представления домашнего каталога , /ключ находится рядом с >ключом:Что касается того, почему корневой каталог обозначается одним
/
, это соглашение, скорее всего, зависит от того факта, что корневой каталог является каталогом верхнего уровня иерархии каталогов, и, хотя другие каталоги могут находиться под ним, обычно нет причина ссылаться на что-либо за пределами корневого каталога. Точно так же сама запись каталога не имеет имени, потому что это граница видимого дерева каталогов.источник
/
. Файловые системы Unix представляют собой единое дерево с точками монтирования для различных дисков.chroot
и такие - вы не можете получить доступ ни к чему, кроме нового корня, но это не значит, что их там нет.chroot()
был представлен, у него не было джейл-подобных свойств , он просто влиял на разрешение имен путей. Даже сегодня привилегированные процессы могут выйти из-под контроля по замыслу . Я также упоминалchroot()
в предыдущем комментарии .>
в качестве разделителя каталогов, но и<
для ссылки на родительский каталог:<
само по себе было эквивалентно..
, в то время как<foo
было эквивалентно../foo
. Я всегда находил это эстетически приятным.Первая иерархическая файловая система, как мы ее знаем сегодня, была разработана для Multics . Конструкция описана в «Файловой системе общего назначения для вторичного хранения» Р. К. Дейли и П. Г. Неймана. Характерной особенностью этой файловой системы является то, что каталог - это файл, который может содержаться в каталоге, как и любой другой файл. Структура файла формирует дерево, в котором все неконечные узлы являются каталогами. Корнем дерева всегда является каталог. Каждый файл имеет имя (имя записи ), которое является уникальным в его родительском каталоге. Корневой каталог не имеет имени, поскольку он не содержится в другом каталоге.
Чтобы назначить файл, вам нужно описать путь от корня дерева. Multics принял естественный синтаксис для имен путей, где, если
P
это путь к каталогу иF
имя файла, то это синтаксис для файла, вызываемого внутри каталога, путь к которому .P>F
F
P
В те времена, когда вы не хотите обременять себя каталогами, у Multics было понятие « рабочий каталог» . Пустое имя файла без указания каталога интерпретируется как файл в рабочем каталоге.
Комбинируя эти правила,
foo
это файл в рабочем каталоге;foo>bar
файл в дочернем каталогеfoo
рабочего каталога и т. д. Эти правила описывают относительные пути, но для построения абсолютных путей требуется дополнительное правило, начиная с корневого каталога. Учитывая, что чтение имени пути слева направо соответствует перемещению от корня к листьям дерева, корень должен быть указан специальным маркером слева от имени пути. Так как имена файлов никогда не бывают пустыми (потому что это часто сбивает с толку), относительное имя пути никогда не начинается с символа>
, что делает его удобным маркером для имен абсолютных путей. Таким образом,>foo
файл называетсяfoo
в корневом каталоге,>foo>bar
это файл называетсяbar
в каталоге с именемfoo
в корневом каталоге и так далее. Это оставляет корневой каталог, который может быть пустой строкой; однако часто не удобно использовать пустую строку в качестве имени пути, поэтому вместо этого она записывается>
, что дает дополнительное преимущество, заключающееся в том, что имя пути является абсолютным тогда и только тогда, когда его первый символ является>
.Unix принял этот дизайн от Multics. Поскольку Unix уже использовал символ
>
для перенаправления вывода в своей командной оболочке, его разработчики выбрали другой символ/
для разделения каталогов в именах путей.источник
В компонентах имени пути в Unix нельзя использовать только два символа: нулевой символ, который завершает строки в C (язык ядра), и косую черту, которая зарезервирована как разделитель пути. Кроме того, компоненты пути не могут быть пустыми строками.
Таким образом, в имени пути у нас есть только два вида токенов: косая черта и компонент.
Предположим, что без добавления каких-либо новых токенов мы хотели бы поддержать поддержку двух типов путей, относительных и абсолютных. Кроме того, мы хотели бы иметь возможность ссылаться на корневой каталог, у которого нет имени (у него нет родителя, который бы дал ему имя).
Как мы можем представлять относительные пути, абсолютные пути и ссылаться на корневой каталог, используя только косую черту?
Самый очевидный способ расширить язык (кроме введения нового токена) - это создать новый синтаксис: придать новый смысл комбинациям токенов, которые являются недопустимым синтаксисом.
Пути, начинающиеся с косой черты, не имеют смысла, поэтому почему бы не использовать начальную косую черту в качестве маркера, который указывает «этот путь является абсолютным, а не относительным».
Путь, который не содержит ничего, кроме косой черты, также недопустим, так почему бы не присвоить ему значение «корневой каталог».
Эти два значения связаны друг с другом, потому что абсолютный путь начинается с поиска в корневом каталоге. Другими словами, начальная косая черта может рассматриваться как имеющая значение:
Затем мы могли бы также добавить завершающую косую черту, что может означать, что «этот путь утверждает, что последний компонент пути - это имя каталога, а не обычный файл или объект любого другого типа: этот конечный слеш обозначает этот каталог аналогично способ, которым начальная косая черта обозначает корневой каталог. "
При всем вышеприведенном синтаксисе у нас все еще есть синтаксис с неназначенным значением: двойная косая черта, тройная косая черта и так далее.
Почему бы просто не ввести другой токен и сделать это по-другому. Вероятно, это связано с тем, что дизайнеры использовали минималистичные подходы в целом. (Почему
ed
редактор отображает только,?
когда вы делаете что-то не так?) Косую черту легко набрать, не требуя сдвига. Язык путей только с двумя типами токенов (компонент и слеш) легко запомнить и использовать.Другое важное соображение заключается в том, что простые манипуляции с путями возможны с использованием только строковых представлений. Например, мы можем довольно легко «перекоренить» абсолютные пути к новому родительскому каталогу:
Это не сработало бы, если бы мы указали абсолютные пути каким-либо другим способом, например, ведущим знаком доллара или чем-то еще:
Этот тип кодирования все еще необходим в некоторых случаях при работе с путями в стиле Unix, но его меньше.
источник
/
правой ногой. Как играть на пианино.