Относительные пути не содержат корневой каталог, так как они относятся к текущему каталогу.
Пример:
development/project/src
Это относительный путь к тому, что называется src
двумя уровнями каталогов ниже текущего каталога. В пути не указано, является ли src
именем каталога, файла или чего-то еще.
В системах Linux вы можете использовать утилиту realpath
для получения полного (абсолютного )пути к имени:
$ realpath development/project/src
/home/myuser/work/development/project/src
Абсолютный путь всегда начинается с корневого каталога. Точнее, он начинается с корневого каталога текущего процесса, который можно изменить с помощью команды chroot
.
В большинстве систем Unix вы можете добавить префикс $PWD
к относительному пути, который начинается в текущем каталоге, чтобы получить абсолютный путь:
$ printf '%s\n' "$PWD/development/project/src"
/home/myuser/work/development/project/src
однако,это просто конкатенация строк, и путь не разрешается точно так же, как realpath
. При условии, что данный относительный путь верен, он даст функциональный абсолютный путь.
POSIXly, чтобы получить символическую ссылку -свободный абсолютный путь к каталогу, где путь (, возможно, относительный к текущему каталогу, возможно, с символическими ссылками )на который хранится в $dir
, при условии, что у вас есть поиск разрешение на этот каталог, вы можете сделать
(
case $dir in
(/*) CDPATH= cd -P "$dir";;
("") CDPATH= cd -P "";;
(*) CDPATH= cd -P "./$dir";;
esac && pwd -P
)
Здесь дословно скопировано из этого текста для включения в следующую редакцию спецификации POSIX .
Как отмечалось там, для случая ""
вы можете захотеть вывести ошибку вместо того, чтобы полагаться на неопределенное в настоящее время поведение cd
или записать его:
(
case "${dir:?directory cannot be empty}" in
(/*) CDPATH= cd -P "$dir";;
(*) CDPATH= cd -P "./$dir";;
esac && pwd -P
)
Обратите внимание, что префикс $dir
с ./
, когда он не является абсолютным, не так важен для $dir
, который не следует рассматривать как вариант, когда он начинается с -
(, для которого CDPATH= cd -P -- "${dir:?cannot be empty}"
было бы достаточно ). ], но для специального значения -
, вместо которого cd
интерпретируется как означающее $OLDPWD
, предыдущий рабочий каталог(и CDPATH= OLDPWD=- cd -P -- "${dir:?cannot be empty}"
не может быть использован переносимым образом для его обхода ).
Один из случаев, когда каталог не может иметь абсолютного пути, — это когда это текущий каталог и он не связан со своим родительским каталогом:
$ mkdir 1
$ cd 1
$ rmdir../1
$ cd -P.
$ ls -ld.
drwxr-xr-x 0 chazelas chazelas 0 Mar 27 06:53./
$ [ -d. ] && echo yes
yes
Все еще там, но:
$ pwd -P
.
$ realpath.
realpath:.: No such file or directory
$ readlink -ve.
readlink:.: No such file or directory
У него нет пути в файловой системе.
Ошибка Нет такого файла или каталога немного вводит в заблуждение, поскольку каталог .
действительно существует (, хотя с ним мало что можно сделать ), но, по крайней мере, в Linux, getcwd()
возвращается с ошибкой ENOENT
, указывающей на то, что связь с текущим каталогом отключена.