Правила синтаксиса пути

Я пишу библиотеку для манипуляции строками пути Unix. В этом случае мне нужно понять несколько неясных углов синтаксиса, о которых большинство людей не беспокоило бы.

Например, насколько я могу судить, кажется, что foo/bar и foo//bar указывают на одно и то же место.

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

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

(К сожалению, поиск таких терминов, как «Синтаксис пути Unix», просто отображает миллион страниц, обсуждая $PATH … Черт, я даже пытаюсь найти подходящие теги для этого вопроса!)

2 Solutions collect form web for “Правила синтаксиса пути”

Существует три типа путей:

  • относительные пути, такие как foo , foo/bar , ../a , Они не начинаются с / и относятся к текущему каталогу процесса, делающего системный вызов с этим путем.
  • абсолютные пути, такие как / , /foo/bar или ///x . Они начинаются с 1 или 3 или более / , они не являются относительными, просматриваются, начиная с каталога / root.
  • POSIX позволяет //foo обрабатываться специально, но не указывает, как это сделать. Некоторые системы используют это для особых случаев, таких как сетевые файлы. Это должно быть ровно 2 слэша.

Помимо начала, последовательности косой черты действуют как одна.

~ является только особенным для оболочки , она расширена оболочкой, она не является особенной для системы вообще. Как он расширяется, зависит от оболочки. Оболочки делают другие формы расширений, такие как globbing ( *.txt ) или переменное расширение /$foo/$bar или другие. Что касается системы ~foo – это только относительный путь, например _foo или foo .

Что нужно помнить:

  • foo/ не совпадает с foo . Это ближе к foo/. чем foo (особенно если foo символическая ссылка) для большинства системных вызовов в большинстве систем ( foo// совпадает с foo/ хотя).
  • a/b/../c не обязательно совпадает с a/c (например, если a/b является символической ссылкой). Лучше всего не лечить .. специально.
  • в целом безопасно считать a/././././b тем же, что и a/b .

Например, насколько я могу судить, кажется, что foo / bar и foo // bar указывают на одно и то же место.

Да. Это обычное явление, поскольку программное обеспечение иногда конкатенирует путь, предполагающий, что первая часть не была прервана с помощью косой черты, поэтому нужно сделать так, чтобы убедиться (что может означать, что они могут быть двумя или более). foo///bar и foo/////bar также указывают на то же место, что и foo/bar . Хорошей функцией для библиотеки манипуляций с траекториями будет то, что уменьшает любое количество последовательных косых черт к одному (кроме начала пути, где он может использоваться по URL-адресу или, как указывает Стефан, для любого неуказанное специальное назначение).

Кроме того, ~ обычно обозначает домашний каталог пользователя

Это преобразование выполняется через оболочку и расширение тильды , которое работает только в том случае, если оно является первым символом пути. Независимо от того, нужно ли вам это решать, зависит от контекста. Если библиотека должна использоваться с обычными программами, которые получают, например, аргументы командной строки, содержащие путь, расширение тильды уже выполняется, когда они видят путь. Единственная ситуация, я вижу, что это вызывает беспокойство, если вы обрабатываете пути непосредственно из текстового файла.

Кроме того, ~ является юридическим символом в пути * nix и не должен изменяться ни на что другое. В соответствии с этим единственными символами, которые не являются законными в имени файла unix, являются / (потому что это разделитель путей) и «null» (или нулевой байт), потому что они являются незаконными в общем тексте.

  • Как выполнить команду bash во всех возможных подкаталогах?
  • Найдите, какие каталоги каждой группы могут получить доступ
  • Найти все папки в каталоге с тем же контентом
  • Как создать каталог с '/' в unix?
  • Создание дубликата пути в Unix
  • Лучший каталог для общих скриптов
  • Перемещение файлов и переименование с использованием части структуры каталогов и части текущего имени файла
  • Странное имя каталога, показанное обратным слэшем
  • Содержит ли мягкая привязка к каталогу жесткие ссылки на его подфайлы?
  • Как Linux обрабатывает несколько последовательных разделителей путей (/ home //// имя пользователя / / файл)?
  • Где найти "розетки"
  • Linux и Unix - лучшая ОС в мире.