Есть несколько realpath
команд вокруг.
realpath
Утилита является оболочкой вокруг realpath
библиотеки функций и была заново много раз .
Debian используется для поддержания realpath
пакета ( отделенного от dwww
так древесного ) , который не изменился , за исключением относительно упаковки и документации с 2001 года, но в настоящее время прекращено. Эта утилита устарела, потому что теперь существует больше стандартных альтернатив (GNU readlink
и скоро GNU realpath
), но в то время утилит GNU даже не было readlink
вообще. Эта реализация realpath
поддерживает несколько options
для предотвращения разрешения символьных ссылок или для вывода с нулевым символом в конце.
BusyBox также включает в себя свою собственную realpath
команду (которая не имеет никакой опции).
GNU coreutils представила realpath
команду в версии 8.15 в январе 2012 года. Это совместимая замена для BusyBox и Debian realpath
, а также имеет много общих с GNU опций readlink
.
realpath
имеет тот же эффект, что и readlink -f
с GNU readlink
. Что отличает две команды (или, скорее, от различных realpath
команд readlink -f
), это дополнительные опции, которые они поддерживают.
GNU realpath
не считается устаревшим; у него противоположная проблема: он слишком новый, чтобы быть доступным везде. Debian обычно опускал GNUrealpath
из своего coreutils
пакета и придерживался собственного realpath
. Я не знаю почему, так как GNU realpath
должен быть заменой. Однако в Debian jessie и Ubuntu 16.04 используется GNU realpath
.
В настоящее время в системах Linux лучше всего канонизировать путь, который может содержать символические ссылки readlink -f
.
В системах BSD есть readlink
команда, отличающаяся от GNU readlink
. В частности, BSD readlink
не имеет возможности канонизировать пути, он только проходит символическую ссылку, переданную ему.
readlink
Между прочим, была такая же проблема - она также была изобретена много раз (исключение этой утилиты, когда символические ссылки были добавлены в Unix, было прискорбным упущением). В настоящее время он стабилизировался в нескольких реализациях со многими несовместимыми флагами (в частности, BSD против GNU).
readlink -f
был в OpenBSD задолго до GNU. Все NetBSD, FreeBSD и OpenBSD теперь естьreadlink -f
(ваша ссылка даже упоминает об этом).realpath
был в FreeBSD и IRIX в течение долгого времени (не знаю, предшествует ли он Debian). HPUX и IRIX тоже естьreadlink
, хотя и нет-f
.realpath
Пакет в Debian экспериментальной теперь один из Coreutils ( в качестве эксперимента , чтобы увидеть , если он ломает вещи). Dwwwrealpath
действует больше какreadlink -e
GNU,readlink -f
так что это не полная заменаrealpath
была в FreeBSD с 2002 года До этого,pwd
делает это (начиная с 2000 года,pwd some-file
назвали быrealpath()
наfile
). Debian имелrealpath
пакет с 1996 годом один на IRIX , вероятно , предшествующий его , хотя я не нашел никаких других доказательств , чем это было в IRIX 6.5 в 1998 году OpenBSD купороса добавилось-f
кreadlink
в 1997 году . GNU добавилиreadlink
в 2003 году, и это было-f
с самого начала.realpath
. Кто-нибудь знает, отличается ли он отreadlink -f
версии?tl; dr
readlink -f
вернется0
для несуществующего файла в существующей директории, тогда какrealpath
вернется1
. Тем не менее,readlink -e
будет вести себя какrealpath
и вернуть1
для несуществующего файла (см. Примечание редактора в конце).readlink -f
readlink -e
realpath
readlink -f
с несуществующим каталогомreadlink -f
поведение варьируется в зависимости от того, какая часть пути не существует.за доступностью
readlink
устанавливается в большинстве дистрибутивов Linux. Принимая во внимание, чтоrealpath
часто должны быть явно установлены.В итоге
Если вы хотите заменить звонки,
realpath ...
используйтеreadlink -e ...
.Протестировано с readlink (GNU coreutils) 8.21 и realpath версии 1.19 на Ubuntu 16.
( Ред .: @AnthonyGeoghegan пишет: « это относится к версии Debian
realpath
. Версия GNUrealpath
ведет себя так же, как иreadlink -f
»)источник
realpath
. Версия GNUrealpath
ведет себя так же, как иreadlink -f
.