Вы также можете определить его как локальную переменную, создав последний массив размера один (например, Function []), а затем назначьте функцию элементу 0. Сообщите мне, если вам нужен точный синтаксис
Согласно стандартам, pwd -P
должен возвратить путь с разрешенными символьными ссылками.
функция C char *getcwd(char *buf, size_t size)
от unistd.h
должна иметь то же поведение.
Одно из моего избранного 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.
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"
глоток>
Общие сценарии оболочки часто должны находить свой "домашний" каталог, даже если они вызываются как символьная ссылка. Сценарий таким образом должен найти их "реальное" положение всего от 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`
"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