Как определить, действительно ли я нахожусь в символической ссылке из командной строки?

Предположим, у меня есть папка:

cd /home/cpm135/public_html 

и сделать символическую ссылку

 ln -s /var/lib/class . 

Позже я в этом каталоге:

 cd /home/cpm135/public_html/class 

pwd собирается сказать мне, что я в /home/cpm135/public_html/class

Есть ли способ узнать, что я «действительно» в /var/lib/class ? благодаря

В зависимости от того, как настроена ваша команда pwd , она может по умолчанию показывать логический рабочий каталог (выводимый pwd -L ), который отображает местоположение символической ссылки, или физический рабочий каталог (выводимый pwd -P ), который игнорирует символическую ссылку и показывает «реальный» каталог.

Для полной информации вы можете сделать

 file "$(pwd -L)" 

Внутри символической ссылки это вернет

 /path/of/symlink: symbolic link to /path/of/real/directory 

Обратите внимание, что pwd на самом деле является встроенной оболочкой. В зависимости от вашей оболочки и ее конфигурации результаты могут измениться. Для более портативного решения вы должны использовать /bin/pwd . Фрагмент из справочной страницы:

 NAME pwd - print name of current/working directory SYNOPSIS pwd [OPTION]... DESCRIPTION Print the full filename of the current working directory. -L, --logical use PWD from environment, even if it contains symlinks -P, --physical avoid all symlinks --help display this help and exit --version output version information and exit If no option is specified, -P is assumed. NOTE: your shell may have its own version of pwd, which usually supersedes the version described here. Please refer to your shell's documentation for details about the options it supports. 

В общем, вы можете разрешить полный канонический путь для любого файла / каталога с помощью readlink -f . readlink -f . работает подобно pwd -P .

Вы действительно находитесь в /home/cpm135/public_html/class – это единственный правильный ответ на вопрос «что такое мой текущий рабочий каталог».

Когда вы ссылаетесь на /var/lib/class … это не совсем то, где вы находитесь, но больше о том, каким путем вы туда добрались .

Когда вы запускаете /bin/pwd , он вычисляет ваш текущий рабочий каталог, просматривая. и .. директории (те, которые перечислены в верхней части ls -la ), разработка которой каталог в .. совпадает с. а затем работать назад до .. и. обратитесь к одному и тому же каталогу. Как только все будет сделано, он знает, каков ваш текущий рабочий каталог.

Когда вы запускаете встроенную оболочку pwd , она не следует этой процедуре (хотя она может при необходимости использовать ее), вместо этого она запоминает путь, который вы использовали для получения здесь. Таким образом, каждый раз, когда вы выполняете команду cd , ваша оболочка помнит, что в качестве части пути, где вы сейчас находитесь, и pwd выводит то, что он рассчитал, на основе всех команд cd вы сделали – что может или не может быть вашим фактическим рабочим каталогом.

Вещи могут стать действительно странными, когда вы делаете ln -s . foo ln -s . foo и сохранить cd ing в foo – /bin/pwd скажет, что вы все еще в одном каталоге, но оболочка, встроенная в pwd , скажет, что вы находитесь в /foo/foo/foo/foo/foo/foo – даже хотя такой каталог даже не существует. (Тем не менее, вы, вероятно, можете cd в него.)

Другим источником путаницы является переименование каталогов. /bin/pwd же заберет изменения, но встроенный pwd не будет, пока вы не сделаете то, что говорит ему, что имя старого каталога не имеет значения.

По сути, вы спрашиваете, показывать ли фактический путь к текущему рабочему каталогу. Ну, есть функция python и os.getcwd()

Ниже вы найдете небольшой тест из каталога «VirtualBox VMs», который находится в моем домашнем каталоге. На самом деле это символическая ссылка на другой каталог, расположенный на другом жестком диске, установленный на /mnt/HDD .

 bash-4.3$ file "$(pwd)" /home/xieerqi/VirtualBox VMs: symbolic link to /mnt/HDD/VirtualBox VMs/ bash-4.3$ python -c 'import os; print os.getcwd()' /mnt/HDD/VirtualBox VMs 

Как вы можете видеть, python os.getcwd() разрешает реальный путь каталога, а не путь symlink.