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

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

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

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

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

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

  • Как изменить текущий каталог графически только с помощью клавиатуры?
  • Разница между lib, lib32, lib64, libx32 и libexec
  • Почему я не могу перейти в папку «Мои документы»?
  • Почему у меня нет папки и файла с тем же именем?
  • Перенаправить домой общий раздел NTFS
  • Использование команды rename для переименования первой части файла
  • Что такое ./ и ../ каталоги?
  • Зеркалирование двух каталогов
  • 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» (или нулевой байт), потому что они являются незаконными в общем тексте.

    Interesting Posts

    Пакетное удаление информации exif

    Подводя массив внутри awk?

    Как распаковать только часть файла?

    Как мне перейти с gnome на i3 Debian 8

    Нормально ли, что «airmon-ng start wlan0» останавливает Wi-Fi на Кали?

    Права на наследование файлов каталога, на которые он скопирован?

    Adobe Flash, установленная в Firefox, но не в Chromium, получение ошибки установки Ошибка – AptUrl: канал «утопический партнер» не знает

    Универсальный менеджер пакетов для установки / удаления?

    Как перезагрузить USB-устройство после безопасного извлечения?

    Можно ли использовать разные rootfs, с которыми связано одно ядро?

    Как избавиться от «Ничего не найдено» при запуске «rm *»

    Использование символов UTF-8 с программой сообщений `write`

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

    Арка иногда не приостанавливает

    Установите еще одну версию PHP. Fedora 17

    Linux и Unix - лучшая ОС в мире.