Как разрешить символьные ссылки в сценарии оболочки

Вы также можете определить его как локальную переменную, создав последний массив размера один (например, Function []), а затем назначьте функцию элементу 0. Сообщите мне, если вам нужен точный синтаксис

211
задан Greg Hewgill 28 July 2009 в 17:29
поделиться

5 ответов

Согласно стандартам, pwd -P должен возвратить путь с разрешенными символьными ссылками.

функция C char *getcwd(char *buf, size_t size) от unistd.h должна иметь то же поведение.

getcwd pwd

89
ответ дан mklement0 23 November 2019 в 04:32
поделиться

Одно из моего избранного realpath foo

realpath - return the canonicalized absolute pathname

realpath  expands  all  symbolic  links  and resolves references to '/./', '/../' and extra '/' characters in the null terminated string named by path and
       stores the canonicalized absolute pathname in the buffer of size PATH_MAX named by resolved_path.  The resulting path will have no symbolic link, '/./' or
       '/../' components.
16
ответ дан Gregory 23 November 2019 в 04:32
поделиться
readlink -f "$path"

<глоток> Примечание редактора: вышеупомянутые работы с [1 121] GNU readlink и FreeBSD/PC-BSD/OpenBSD readlink, но не на OS X с 10,11.
предложения GNU readlink дополнительные, связанные опции, такой как -m для разрешения символьной ссылки, существует ли окончательная цель.

Примечание начиная с GNU coreutils 8.15 (2012-01-06), существует программа realpath , доступная, который является менее тупым и более гибким, чем вышеупомянутое. Это также совместимо с FreeBSD util того же имени. Это также включает функциональность для генерации относительного пути между двумя файлами.

realpath $path
<час>

[Администраторское дополнение ниже из комментария [1 116] halloleo — danorton]

Для Mac OS X (через, по крайней мере, 10.11.x), используйте readlink без -f опция:

readlink $path

<глоток> Примечание редактора: Это не разрешит символьные ссылки рекурсивно и таким образом не сообщит окончательный цель; например, учитывая символьную ссылку a, который указывает на [1 110], который в свою очередь указывает на [1 111], это будет только отчет b (и не гарантирует, что это производится как полный путь ).
Использование следующий perl команда на OS X для заполнения разрыва пропавших без вести readlink -f функциональность:
perl -MCwd -le 'print Cwd::abs_path(shift)' "$path"

385
ответ дан mklement0 23 November 2019 в 04:32
поделиться

Общие сценарии оболочки часто должны находить свой "домашний" каталог, даже если они вызываются как символьная ссылка. Сценарий таким образом должен найти их "реальное" положение всего от 0$.

cat `mvn`

на моей системной печати сценарий, содержащий следующее, которое должно быть хорошим намеком, в чем Вы нуждаетесь.

if [ -z "$M2_HOME" ] ; then
  ## resolve links - $0 may be a link to maven's home
  PRG="$0"

  # need this for relative symlinks
  while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
      PRG="$link"
    else
      PRG="`dirname "$PRG"`/$link"
    fi
  done

  saveddir=`pwd`

  M2_HOME=`dirname "$PRG"`/..

  # make it fully qualified
  M2_HOME=`cd "$M2_HOME" && pwd`
1
ответ дан Hugo 23 November 2019 в 04:32
поделиться

"pwd-P", кажется, работает, если Вы просто хотите каталог, но если по некоторым причинам Вы хотите название фактического исполняемого файла, я не думаю, что это помогает. Вот мое решение:

#!/bin/bash

# get the absolute path of the executable
SELF_PATH=$(cd -P -- "$(dirname -- "$0")" && pwd -P) && SELF_PATH=$SELF_PATH/$(basename -- "$0")

# resolve symlinks
while [[ -h $SELF_PATH ]]; do
    # 1) cd to directory of the symlink
    # 2) cd to the directory of where the symlink points
    # 3) get the pwd
    # 4) append the basename
    DIR=$(dirname -- "$SELF_PATH")
    SYM=$(readlink "$SELF_PATH")
    SELF_PATH=$(cd "$DIR" && cd "$(dirname -- "$SYM")" && pwd)/$(basename -- "$SYM")
done
25
ответ дан abcoep 23 November 2019 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: