Два разделителя пути в macOS: наследие от классической Mac OS и Unix

macOS поддерживает два разных разделителя пути: слеш (/) и двоеточие (:). Слеш используется в Unix-подобных системах, двоеточие, в классической Mac OS. Эта особенность возникла при слиянии двух операционных систем с разными файловыми системами: HFS+ (двоеточие) и UFS (слеш). Система автоматически переводит один разделитель в другой в зависимости от контекста.

Особенность видна в AppleScript, который восходит к System 7 и использует двоеточие как основной разделитель пути. При этом слеш в имени файла будет отображаться по-разному: для BSD-программ как двоеточие, для приложений Carbon как слеш. Даже после замены HFS+ на APFS в 2017 году двойная поддержка разделителей была сохранена для обратной совместимости с огромным объёмом существующего ПО.

Ключевые факты

  • macOS содержит два разделителя пути из-за исторического слияния Mac OS и NeXTSTEP
  • Файловые системы HFS+ и UFS использовали разные разделители (двоеточие и слеш)
  • Одно и то же имя файла может отображаться по-разному в зависимости от приложения
  • AppleScript использует двоеточие как основной разделитель из-за наследия System 7
  • APFS сохранил двойную поддержку для обратной совместимости с существующим ПО

Почему это важно

Двойная система разделителей, это следствие архитектурного выбора Apple при объединении двух операционных систем. Разработчики должны понимать, что одно и то же имя файла может интерпретироваться по-разному в зависимости от того, через какой API осуществляется доступ. Это может привести к неожиданному поведению и ошибкам при работе с файловой системой, особенно в скриптах и инструментах, которые используют разные API.

Кому это важно

В первую очередь это касается разработчиков, работающих с macOS, особенно тех, кто пишет утилиты командной строки или системные скрипты. Администраторы систем и инженеры DevOps должны учитывать эту особенность при работе с кроссплатформенными инструментами. Также это актуально для разработчиков, использующих AppleScript или интегрирующих приложения, которые работают с путями файлов на разных уровнях.

Как это применить

При работе с файловыми путями на macOS следует явно запрашивать POSIX-пути, когда это необходимо. В AppleScript можно использовать функцию POSIX path() для получения пути в стандартном формате Unix. При разработке кроссплатформенных приложений необходимо помнить о возможности существования файлов с необычными символами в имени. Тестирование должно включать проверку работы с файлами, содержащими потенциально проблемные символы.

Можно ли доверять

Информация основана на официальной документации Apple и исследовательской статье инженеров Apple, представленной на Usenix 2000. Описанное поведение подтверждено практическими примерами использования ls, Finder и osascript. Apple документировала эту особенность и по-прежнему сохраняет двойную поддержку в современных версиях macOS, что указывает на намеренный архитектурный выбор, а не на баг.

Риски и подводные камни

Основной риск заключается в неожиданном поведении при создании или обработке имён файлов. Файл, созданный через графический интерфейс Finder, может быть недоступен или неправильно отображаться при обращении через командную строку. Скрипты и инструменты, не учитывающие эту особенность, могут столкнуться с проблемами совместимости. Для критичных операций рекомендуется использовать явное преобразование путей и тестирование с реальными сценариями использования.

«The translation layer can create a user-visible schizophrenia in the rare cases of file names containing colon characters, which appear to Carbon applications as slash characters, but to BSD programs and Cocoa applications as colons.»

— Apple engineers, Usenix 2000