Существует ли команда Unix для получения абсолютного (и канонизированного) пути из относительного пути, который может содержать символические ссылки?
63
Вы можете использовать readlink
утилиту с -f
опцией:
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
Некоторые дистрибутивы, например те, которые используют GNU coreutils и FreeBSD , также поставляются с realpath(1)
утилитой, которая в основном просто вызывает realpath(3)
и делает почти то же самое.
-f
Переключатель не существует на Mac OS X (по крайней мере , по состоянию на 10.8.5). Без-f
переключателя он просто возвращает код ошибки.readlink
ниrealpath
Solaris, ни HP-UX, в частности.brew install coreutils
apple.stackexchange.com/a/69332/23040 , и если вы не хотите делать шаг, который перенаправляет все стандартные инструменты CLI Mac к недавно установленным эквивалентам GNU, просто позвонитеgreadlink
.Портативно,
PWD
переменная устанавливается оболочкой в одно абсолютное местоположение текущего каталога. Любой компонент этого пути может быть символической ссылкой.Если вы хотите устранить
.
и..
как хорошо, перейдите в каталог , содержащий файл и получить$PWD
там:Нет переносимого способа перейти по символическим ссылкам. Если у вас есть путь к каталогу, то в большинстве устройств
$(cd -- "$dir" && pwd -P 2>/dev/null || pwd)
есть путь, который не использует символические ссылки, потому что оболочки, которые отслеживают символические ссылки, имеют тенденцию реализовыватьсяpwd -P
(«P» для «физического»).Некоторые устройства предоставляют утилиту для печати «физического» пути к файлу.
readlink -f
, как и FreeBSD ≥8.3, NetBSD ≥4.0 и OpenBSD еще до 2.2.realpath
(он также присутствует в некоторых системах Linux и в BusyBox).Если Perl доступен, вы можете использовать
Cwd
модуль .источник
pwd
($(cd -- "$dir" && pwd -P 2>/dev/null | pwd)
)? Кажется, это не заботится о stdin.||
Является ли
pwd
подходит для ваших нужд? Это дает абсолютный путь к текущему каталогу. Или, может быть, вам нужен realpath () .источник
alister
иrss67
в этой статье представим наиболее стабильный, совместимый и простой способ. Я никогда не видел лучшего способа, чем этот.Если вы хотите вернуться в исходное местоположение,
или же
Я хотел бы, чтобы это помогло. Это было лучшее решение для меня.
источник
ABSPATH=$(cd -- "$RELPATH" && pwd)
. Обратите внимание на двойные кавычки вокруг подстановки (чтобы не разрывать, если путь содержит пробелы и символы с пробелами) и--
(в случае, если путь начинается с-
). Также это работает только для каталогов и не канонизирует символические ссылки в соответствии с запросом. Смотрите мой ответ для более подробной информации.Другие ответы здесь были хороши, но были недостаточны для моих нужд. Мне нужно было решение, которое я мог бы использовать в своих скриптах на любом компьютере. Моим решением было написать сценарий оболочки, который я могу вызывать из сценариев, где он мне нужен.
Это решение написано для Bourne Shell для переносимости. У меня есть это в сценарии с именем "respath.sh".
Этот скрипт можно использовать так:
Или вот так
Сценарий разрешает путь в первом аргументе, используя путь из второго аргумента в качестве начальной точки. Если указан только первый аргумент, сценарий разрешает путь относительно вашего текущего рабочего каталога.
источник
pwd
встроенную функцию и не поддерживает ее-P
(оболочка Bourne не реализовала такую логическую обработку $ PWD, как это делают оболочки POSIX).cd -P --
также в случае, если 1-й аргумент содержит некоторые ..case
чек должен быть..|../*)
вместо..*
.dirname $cwd
В случае, если, кроме того, у вас есть некоторый предопределенный путь для
$1
(обычно${PWD}
), будет работать следующее:источник
Уважая ответ всех остальных, я обнаружил, что приведенная ниже функция очень проста и удобна для переноса между linux / MAC OSX, чем другие, которые я нашел везде. Может помочь кому-нибудь.
источник
Предположим, что переменная a хранит имя пути (a = "what")
1. Для потенциального пространства, содержащего путь:
2. Для актуального вопроса, т.е. преобразования пути в абсолютный: readlink может получить содержимое символической ссылки, которое можно использовать следующим образом. (примечание
readlink -f
было бы идеально, но не доступно по крайней мере в Mac OS X bash, в котором -f обозначает ФОРМАТЫ .)3. Только что узнал
pwd -P
вman pwd
: -P это « Показать физический текущий рабочий каталог (все символические ссылки разрешены) » и, следовательно,работать тоже буду.
Вывод: объедините 1 с 2, чтобы удовлетворить оба ваших требования, в то время как имена путей, содержащие пробелы, уже рассмотрены в более кратком 3 .
источник