Каково происхождение опции -E команды realpath в стандарте POSIX issue 8?

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

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

realpath [-E|-e] файл

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

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

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

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

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

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

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

[…]

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

Это действительно изобретение 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.

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

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

Теория

POSIX — это стандарт, который обеспечивает переносимость программного обеспечения между различными операционными системами. Одним из аспектов, который делает ПО совместимым, является стандартизация поведения команды realpath. Хотя утилита realpath существовала и ранее, ее поведение было несовместимым между различными системами, такими как GNU, Solaris, NetBSD и FreeBSD. Поведение этих систем не одинаково в том, что касается обработки файлов, которых не существует. В некоторых системах опция -e требует, чтобы файл существовал, тогда как в других системах такой требования нет.

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

Пример

В прежних реализациях, например, GNU realpath не требует, чтобы каждый компонент пути существовал, если не указана опция -e. С другой стороны, NetBSD realpath требует, чтобы все компоненты пути обязательно существовали. Такое расхождение в поведении может вызвать значительные неудобства при переносе скриптов или программ между разными Unix-подобными системами.

Поэтому для стандартизации была предложена опция -E. Первое упоминание о ней нашлось в обсуждениях с Austin Group — группой, занимающейся развитием POSIX. Разработчики предложили добавление этой опции, чтобы NetBSD могла реализовать поведение, более близкое к GNU по умолчанию — то есть, не требовать, чтобы конечный файл существовал.

Применение

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

С введением этой опции в POSIX, системы, такие как NetBSD, уже начали интеграцию нововведений. На GitHub можно найти подтверждение этого, где NetBSD включила реализацию новой опции в свою версию realpath. Таким образом, объединения этих изменений на уровне POSIX помогает наладить согласованность между UNIX-подобными системами, обеспечивая переносимость и совместимость ПО.

Заключение

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

Источники

  1. POSIX.1-2024 Specification of realpath – The Open Group
  2. История изменений в NetBSD
  3. Обсуждения в Austin Group
  4. Austin Group issue 1457 – документация изменений
Оцените материал
Добавить комментарий

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