Вопрос или проблема
Утилита командной строки 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
для канонизации).
и с возможными путями развития, описанными следующим образом:
Так что мои предпочтения таковы (в порядке убывания):
POSIX добавляет
realpath
с-e
и-E
, иreadlink
без-f
. Неопределенно, какая из-e
или-E
является настройкой по умолчанию. GNU добавляет бездействующую-E
вrealpath
. NetBSD/FreeBSD добавляет-E
и бездействующую-e
вrealpath
.POSIX добавляет
readlink
с-f
(чье поведение одинаково для обеих реализаций). Нетrealpath
.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. Это позволяет разработчикам продвигаться в решении задач, не беспокоясь о расхождениях между различными стандартом системами. Этот шаг важен как для сохранения работы существующего ПО, так и для обеспечения возможности легче адаптироваться к различным средам.