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

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

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

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

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

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

  • В чем разница между home $ и ~ $?
  • Файловая система, которая поддерживает дубликаты имен каталогов
  • Зеркалирование двух каталогов
  • Пользовательский путь поиска пусковой установки в Ubuntu
  • Что такое xhbin?
  • Найти все папки в каталоге с тем же контентом
  • Печатать файлы в обратном порядке из ассоциативного массива в bash
  • для + array + args
  • 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» (или нулевой байт), потому что они являются незаконными в общем тексте.

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