1

Я пытаюсь использовать realpath в сценарии, который должен гарантировать, что он находится под определенным (возможно, символьным) путем. Также скрипт должен быть запущен из любого места, поэтому он не может предполагать, что текущий каталог является тем, в котором находится скрипт. Но...

$ mkdir dir
$ touch dir/script
$ ln -s dir symlink
$ realpath -s symlink/script
/tmp/symlink/script
$ realpath -s symlink       
/tmp/symlink

Пока все хорошо: realpath по умолчанию разрешает символическую ссылку, но ключ -s делает то, что нам нужно.

$ cd symlink 
$ realpath -s script 
/tmp/dir/script
$ realpath -s .
/tmp/dir

Почему в этом случае результат такой же, как и без -s ? Даже если предположить, что разрешение символьных ссылок работает особым образом для текущего каталога, в любом случае здесь есть несоответствие:

$ realpath -s ../symlink/script 
/tmp/symlink/script

1 ответ1

0

Справочная страница realpath гласит:

realpath -s filename

Когда используется опция -s, realpath удаляет только. и .. каталоги, но не символические ссылки из имени файла. Если заданный аргумент имени файла является относительным (то есть не начинается с '/'), realpath -s добавляет к нему текущее имя каталога, полученное из системного вызова getcwd (2) перед дальнейшей обработкой.

Поскольку вы вызываете realpath -s script а script является символической ссылкой, realpath добавляет только текущий рабочий каталог, заданный pwd .

Однако, похоже, что поведение realpath зависит от его соотв. реализация getcwd(); Под сценарием cygwin realpath -s script показан абсолютный путь.

Вы можете получить абсолютный путь, например, с

realpath -s $(pwd -P)/script

as pwd -P вывести полное имя текущего рабочего каталога, избегая всех символических ссылок.

Или использовать

readlink -e script

где -e для "канонизации путем следования каждой символической ссылке в каждом компоненте данного имени рекурсивно".

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .