Предположим, у меня есть папка:
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
? Благодарность
shell
symlink
cd-command
working-directory
Оливер Уильямс
источник
источник
fish
оболочка автоматически разрешает символическую ссылку, когда выcd
в нее входите .Ответы:
В зависимости от того, как
pwd
настроена ваша команда, она может по умолчанию показывать логический рабочий каталог (вывод с помощьюpwd -L
), который будет показывать местоположение символической ссылки, или физический рабочий каталог (вывод с помощьюpwd -P
), который игнорирует символическую ссылку и показывает «настоящий» каталог.Для полной информации вы можете сделать
Внутри символьной ссылки это вернет
источник
-P
флаг был тем, что мне было нужно. Спасибоtest "$(pwd -L)" = "$(pwd -P)" && echo No symlinks
(или заменить&& echo No symlinks
с|| echo Symlinks
).file "$(pwd)"
работает только если символическая ссылка является последним компонентом каталога. Он не обнаруживает символическую ссылку OP, когда CDed к/home/cpm135/public_html/class/foo/bar
. Я ничего не знаю о том, что печатает информацию для всех символических ссылок в путевом имени, но вы также можете использоватьrealpath .
, что, я думаю, эквивалентноpwd -P
Обратите внимание, что
pwd
на самом деле это встроенная оболочка. В зависимости от вашей оболочки и ее конфигурации результаты могут меняться. Для более портативного решения, вы должны использовать/bin/pwd
. Фрагмент страницы руководства:В общем, вы можете разрешить полный канонический путь любого файла / каталога, используя
readlink -f
.readlink -f .
работает аналогичноpwd -P
.источник
readlink -f
не доступен на всех юниксы (например , не доступны на OS-X)Вы действительно
/home/cpm135/public_html/class
- это единственный правильный ответ на вопрос «каков мой текущий рабочий каталог».Когда вы ссылаетесь на
/var/lib/class
... это не совсем о том, где вы находитесь, а больше о том, каким путем вы туда добирались .Когда вы запускаете
/bin/pwd
, он выясняет ваш текущий рабочий каталог, посмотрев на. и .. каталоги (перечисленные вверхуls -la
), определяющие , какой каталог в .. совпадает с. и затем работает в обратном направлении до .. и. обратитесь к той же директории. Как только все это будет сделано, он знает, какой у вас текущий рабочий каталог.Когда вы запускаете
pwd
встроенную оболочку, она не следует этой процедуре (хотя при необходимости она может выполнить некоторые из них) - вместо этого она запоминает путь, который вы выбрали, чтобы попасть сюда. Поэтому каждый раз, когда вы выполняетеcd
команду, ваша оболочка запоминает это как часть пути, чтобы добраться до того места, где вы сейчас находитесь, иpwd
выводит на экран то, что она рассчитала на основе всехcd
команд, которые вы выполнили - что может или не может быть вашим фактическим рабочий каталог.Когда вы делаете a
ln -s . foo
и продолжаете работатьcd
в foo, все может стать очень странным -/bin/pwd
скажет, что вы все еще находитесь в том же каталоге, но встроенная оболочкаpwd
скажет, что вы находитесь в нем,/foo/foo/foo/foo/foo/foo
даже если такого каталога вообще не существует. (Тем не менее, вы, вероятно, можетеcd
в это.)Еще один источник путаницы - переименование каталогов.
/bin/pwd
затем сразу же перейдет к изменению, но встроенныйpwd
не будет, пока вы не сделаете что-то, что скажет, что старое имя каталога не имеет значения.источник
pwd
встроенной оболочкой и/bin/pwd
объяснения того, как автономная версия предоставляет более полезную информацию (которая может ответить на исходный вопрос).-P
и-L
, упомянутым в других ответах. Короче говоря, в некоторых реализациях по умолчанию используется одна, в другой - другая. В системе Centos, которую я должен передать, встроенная функция bash по умолчанию является логической, а/bin/pwd
по умолчанию - физической, но обе они принимают обе опции командной строки и согласовывают результат, когда они предоставляются.ls ..
покажет содержимое/var/lib
, а не/home/cpm135/public_html
.cd ..
является особенным: оболочка выполняет специальное отслеживание «как вы туда попали» и фактически не выполняетchdir("..")
системный вызов. Что касается ядра, текущий рабочий каталог вашей оболочки (/proc/self/cwd
) - это просто точка монтирования: пара узлов. Это похоже на дескриптор открытого файла в каталоге, поэтому переименование каталога не сломает вашу оболочку. (cd .
обновить$PWD
переменную оболочки ). Вы делаете полезное замечание, поэтому я бы высказался об этом, когда исправлюсьПо сути, вы спрашиваете, нужно ли показывать фактический путь к текущему рабочему каталогу. Ну есть с питоном и
os.getcwd()
функциейНиже вы видите небольшой тест из каталога «VirtualBox VMs», расположенного в моем домашнем каталоге. В действительности это символическая ссылка на другой каталог, расположенный на другом жестком диске, смонтированный в
/mnt/HDD
.Как видите, Python
os.getcwd()
разрешает реальный путь к каталогу, а не путь символической ссылки.источник