Команда realpath в POSIX, выпуск 8

Вопрос или проблема

Утилита realpath теперь определена в POSIX issue 8 (2024): realpath — разрешение имени пути

realpath [-E|-e] file

Утилита realpath должна канонизировать имя пути, указанное операндом файла, следующим образом:

Если вызов функции realpath() с указанным именем пути в качестве первого аргумента будет успешным, канонизированным именем пути должно стать имя, которое будет возвращено этим вызовом realpath(). В противном случае:

  • Если указана опция -e, канонизация должна завершиться неудачно.

  • Если указана опция -E, то, если вызов функции realpath() с указанным именем пути в качестве первого аргумента встретит ошибочное условие, отличное от [ENOENT], канонизация должна завершиться неудачно; если вызов встретит ошибку [ENOENT], realpath должна расширить все символические ссылки, которые будут встречены при попытке разрешения указанного имени пути, используя алгоритм, указанный в XBD 4.16 Pathname Resolution, за исключением того, что любые конечные символы <slash>, которые не являются также начальными, должны быть проигнорированы. Если это расширение успешно и префикс пути расширенного имени пути разрешается в существующую директорию, канонизированное имя пути должно стать расширенным именем пути. Во всех остальных случаях канонизация должна завершиться неудачно. Если расширенное имя пути не пустое, не начинается с , и имеет ровно один компонент имени пути, оно должно обрабатываться так, как если бы имело префикс пути “./”.

  • Если опции не указаны, realpath должна канонизировать указанное имя пути неопределенным образом так, чтобы получившееся абсолютное имя пути не содержало никаких компонентов, ссылающихся на файлы типа символическая ссылка, и не содержало никаких компонентов, которые являются точкой или точка-точкой.

После успешной канонизации realpath должна записать канонизированное имя пути, за которым следует символ, на стандартный вывод.

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

[…]

Мой вопрос: опция -e уже поддерживается по крайней мере GNU и Solaris realpath, но я не могу найти упоминания о опции -E в любом realpath, который я мог проверить (macOS, FreeBSD, Solaris, GNU). Может быть, OpenGroup просто это изобрел?

Это действительно изобретение POSIX, добавленное для согласования несовместимого поведения в разных реализациях: coreutils realpath не требует существования файла, если не указана опция -e, тогда как NetBSD realpath требует, чтобы файл существовал.

Для решения этой проблемы была изобретена опция -E; она была реализована в NetBSD realpath:

С опцией E
(по умолчанию)
не является ошибкой, если последний компонент
разрешенного имени пути ссылается на файл,
который не существует.

(См. соответствующее изменение для подробностей.)

Опция -E впервые появилась в этом вопросе:

Вы (или кто-то, кто поддерживает realpath для NetBSD) не могли бы добавить
опцию -E, которая сделает вашу версию вести себя, как по умолчанию в coreutils?
Тогда POSIX сможет указать ее с опциями -e и -E, и сказать, что не указано, какая из них является стандартной.

Альтернативой будет возврат к первоначальному плану просто добавить
readlink (с опцией -f для канонизации).

и с возможными путями развития, описанными следующим образом:

Так что мои предпочтения (в порядке убывания):

  1. POSIX добавляет realpath с -e и -E, и readlink без -f.
    Не указано, какая из -e или -E является стандартной.
    GNU добавляет не действующую -E в realpath.
    NetBSD/FreeBSD добавляют -E и не действующую -e в realpath.

  2. POSIX добавляет readlink с -f (поведение которого одинаково для
    обеих реализаций). Без realpath.

  3. POSIX добавляет realpath без -e и -E, и readlink без -f.
    Не указано, нужно ли realpath, чтобы последний компонент существовал.

Вы можете увидеть историю записи POSIX в вопросе Austin Group 1457.

.

Ответ или решение

Вопрос о команде realpath в POSIX issue 8 (2024) на первый взгляд может показаться простым, но он скрывает за собой более глубокие технические нюансы, связанные с различиями в реализации команды в различных системах и попытками стандартизации данных различий посредством POSIX спецификаций. Рассмотрим эту тему подробнее.

Теория

realpath — это утилита, основная задача которой заключается в канонизации заданного пути. Канонизация подразумевает следующее: преобразование каждого компонента пути в наиболее "истинный" или объективный формат с учетом реальной структуры файловой системы. Это особенно важно при работе с символическими ссылками, компонентами . (текущая директория) и .. (родительская директория), которые должны быть корректно интерпретированы.

POSIX issue 8 вводит realpath с двумя ключевыми опциями: -e и -E. Эти опции управляют поведением команды в случаях, когда файл или путь не существуют или когда есть другие ошибки при попытке канонизации пути:

  1. Опция -e: если указана, канонизация завершается неуспешно, если путь или его части не существуют. Это соответствует более строгим требованиям к системе, когда необходимо гарантированное существование всех элементов пути.

  2. Опция -E: введена как компромисс между различными реализациями realpath. Эта опция позволяет продолжать канонизацию, даже если конечный компонент пути не существует, при условии, что все промежуточные компоненты существуют как директории.

  3. Если опции не указаны, канонизация происходит в неопределённой манере, главная цель которой — возвращение абсолютного пути без символических ссылок и без компонентов . или ...

Пример

Например, GNU версия realpath не требовала существования файла, если не была указана опция -e, наоборот, NetBSD версия требовала, чтобы файл существовал в любом случае. Введение опции -E в спецификацию POSIX стало решением проблемы несовместимости, позволяя указать конкретное поведение для каждого из упомянутых случаев.

NetBSD адаптировала эту опцию в соответствии с новым стандартом POSIX, что позволяет использовать realpath более универсально без жёсткой привязки к системе.

Применение

Это отличие особенно важно для разработчиков, работающих в многоплатформенной среде, где различные утилиты могут вести себя неодинаково. Здесь важна стандартизация поведения: когда вы используете POSIX-совместимые инструменты, такие как realpath, вы можете быть уверены, что поведение будет соответствовать тому, что описано в стандарте, без необходимости вносить изменения в код для каждого конкретного случая.

Таким образом, добавление опции -E можно рассматривать как отражение компромиссов в стандартизации, где учитываются разнородные системы и их специфика, с целью уменьшения проблем совместимости и улучшения переносимости программ.

Конечные пользователи и разработчики выигрывают от таких добавлений, так как это упрощает управление кодовой базой при написании скриптов и программ, которые должны корректно работать на различных UNIX-подобных системах. В конечном итоге, стандартизация, подобная этой, помогает поддерживать унифицированный подход ко многим задачам администрирования и разработки, облегчая кроссплатформенные процессы.

В заключение, можно утверждать, что, хотя команда realpath и выглядит на первый взгляд простой, её полная интеграция и стандартизация через POSIX — важный шаг для развития консистентной экосистемы в мире UNIX-систем. Введение опции -E — это стратегическое решение, которое позволяет урегулировать ключевые различия между версиями утилит различных поставщиков, делая работу разработчиков и системных администраторов более предсказуемой.

Оцените материал
Добавить комментарий

Капча загружается...