Имя файла Unix и путь [закрыто]

-1
27.03.2018, 08:18
2 ответа

Относительные пути не содержат корневой каталог, так как они относятся к текущему каталогу.

Пример:

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. При условии, что данный относительный путь верен, он даст функциональный абсолютный путь.

0
28.01.2020, 05:07

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, указывающей на то, что связь с текущим каталогом отключена.

4
28.01.2020, 05:07

Теги

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