Як сказати, чи дійсно я знаходжусь у командному рядку з місця розташування символьного посилання?


33

Припустимо, у мене є папка:

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? Спасибі



1
Деякі оболонки насправді не дозволяють вам знаходитися всередині симпосилання. Наприклад, fishоболонка автоматично розв’язує симпосилання, коли ви cdпереходите в неї.
трис

Відповіді:


56

Залежно від того, як pwdналаштована ваша команда, вона може за замовчуванням відображати логічний робочий каталог (виводити за pwd -L), який би відображав розташування символьної посилання, або фізичний робочий каталог (виводить за pwd -P), який ігнорує симпосилання та показує "реальний" каталог.

Для отримання повної інформації ви можете це зробити

file "$(pwd -L)"

Всередині симпосилання це повернеться

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

1
так, -Pпрапор був тим, що мені було потрібно. Спасибі
Олівер Вільямс

6
Щоб також відповісти на питання в заголовку, просто скористайтеся test "$(pwd -L)" = "$(pwd -P)" && echo No symlinks(або замініть && echo No symlinksна || echo Symlinks).
CVn

1
Це прекрасно відповідає на питання без необхідності повторювати. Якщо питання було "Як відобразити повідомлення, якщо я перебуваю в каталозі з посиланнями?", Тоді буде потрібне відлуння.
Arronical

file "$(pwd)"працює лише якщо симпосилання є останнім компонентом каталогу. Він не виявляє симпосилання ОП при CD-диску /home/cpm135/public_html/class/foo/bar. Я не знаю нічого, що друкує інформацію для всіх символьних посилань у назви шляху, але ви також можете використовувати realpath ., що, на мою думку, еквівалентноpwd -P
Пітер Кордес

17

Зауважте, що 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.


2
Хоча я навчився важкого шляху, який readlink -fдоступний не в усіх Unice (наприклад, недоступний для OS-X)
abligh

3

Ви справді перебуваєте /home/cpm135/public_html/class- це єдина правильна відповідь на питання "який у мене поточний робочий каталог".

Коли ви посилаєтесь на /var/lib/class... це не справді про те, де ви знаходитесь, а більше про те, яким шляхом ви проїхали туди .

Під час запуску /bin/pwdвін визначає поточний робочий каталог, переглядаючи. і .. каталоги (ті, що вказані вгорі ls -la), які розробляють, який каталог у .. відповідає. а потім працює назад до .. і. посилайтеся на той самий каталог. Після того, як буде зроблено все це, він знатиме, що це ваш поточний робочий каталог.

Коли ви запускаєте pwdвбудовану оболонку, вона не дотримується цієї процедури (хоча при необхідності вона може зробити якусь частину) - натомість вона запам'ятовує шлях, який ви пройшли сюди. Отже, кожен раз, коли ви виконуєте cdкоманду, ваша оболонка пам'ятає, що в рамках шляху до того, де ви зараз знаходитесь, і pwdвиводить, що вона розрахована, виходячи з усіх cdкоманд, які ви виконали - які можуть бути, а можуть і не бути вашими фактичними робочий каталог.

Речі можуть стати дуже дивними, коли ви робите ln -s . fooта продовжуєте працювати cdв foo - /bin/pwdскажуть, що ви все ще в тому самому каталозі, але вбудована оболонка pwdскаже, що ви перебуваєте /foo/foo/foo/foo/foo/foo- хоча такого каталогу навіть насправді не існує. (Це сказав - ви, мабуть, можете cd в це ввійти.)

Ще одне джерело плутанини є, якщо каталоги будуть перейменовані. /bin/pwdТоді негайно підходить до зміни, але вбудований pwdне буде, поки ви не зробите щось, що скаже, що стара назва каталогів не має значення.


1
Ви не відповідаєте на питання, ви відхиляєте його.
Дмитро Григор’єв

4
Хоча це не відповідає на питання безпосередньо , я думаю, що це корисна публікація для розуміння різниці між pwdвбудованою оболонкою /bin/pwdта пояснення того, як окрема версія надає більше корисної інформації (яка може відповісти на початковий запитання).
Ентоні Г - справедливість для Моніки

1
Усі ці відмінності зводяться до -Pта -Lваріантів, згаданих іншими відповідями. Коротше кажучи, деякі реалізації за замовчуванням одні, а інші - інші. У системі Centos, яку я маю подати, вбудований bash є дефолтом до логічного та /bin/pwdдо дефіциту - фізичним, але обидва приймають обидва варіанти командного рядка та погоджуються на результат, коли їм надано.
IMSoP

1
Питання ґрунтується на неправильній передумові - "чи можна дізнатися, що я" справді "в / var / lib / class?" Це сказав ... пояснюючи, що це насправді означає, це допомагає йому зрозуміти, що він насправді шукає. Варіанти pwd -P та -L вже згадувалися ...
dougmc

1
Ви маєте свій аргумент назад. ls ..покаже вміст /var/lib, ні /home/cpm135/public_html. cd ..особливий: оболонка робить спеціальне відстеження "як ти потрапила туди" і насправді не робить chdir("..")системний виклик. Що стосується ядра, то поточний робочий каталог вашої оболонки ( /proc/self/cwd) - це лише точка кріплення: пара inode. Це як дескриптор відкритого файлу в каталозі, тому перейменування каталогу не порушує вашу оболонку. ( cd .для оновлення $PWDзмінної оболонки ). Ви робите корисну точку, тому я б схвалював це, коли це було виправлено
Пітер Кордес

1

По суті, ви запитуєте, чи є показ фактичного шляху поточного робочого каталогу. Ну, є з 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's os.getcwd()вирішує реальний шлях до каталогу, а не шлях symlink.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.