Два разделителя пути в 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