Ядро поддерживает текущий каталог (по индексу) и, когда вам нужен текущий каталог, оно определяет его имя, проходя вверх по дереву каталогов (используя ..), чтобы найти имена всех компонентов пути.Это «настоящий» или иногда называемый «физический» рабочий каталог.Есть библиотечная функция getcwd (3), которая делает это за вас;в более поздних системах Linux это фактически системный вызов, который помогает получить согласованное представление, если родительские каталоги находятся в процессе переименования.
Некоторые оболочки, особенно bash, поддерживают переменную среды PWD дляотслеживать, где вы находитесь, и если вы изменили каталог с помощью символической ссылки, эта переменная среды покажет это.Они называют это «логическим» путем.
/ bin / pwd показывает результат getcwd (3), то есть реальный путь;если вы дадите это -L, он скажет вам значение PWD (если это не мусор, тогда вы получите реальный путь).(Версия Gnu / bin / pwd выполняет больше работы, чем эта, чтобы справиться со сложностями родительских каталогов без разрешения на чтение и очень длинных имен путей.)
Встроенный в Bash pwd показывает «логический» путь с любымсимволические ссылки, которые вы использовали, чтобы попасть туда;даже если это теперь мусор (т.е. удален или переименован, так как вы использовали его).Значение по умолчанию для встроенного pwd можно изменить с помощью команды set -o Physical (on) или set + o Physical (off is plus!). Запрос по умолчанию (содержащий текущий каталог) также следует за параметром.
# make a directory with a symlink alias
cd /tmp
mkdir real
ln -s real sym
cd sym
pwd # will say sym
pwd -L # will say sym
pwd -P # will say real
/bin/pwd # will say real
/bin/pwd -L # will say sym
/bin/pwd -P # will say real
rm /tmp/sym
pwd # says sym, though link no longer exists
/bin/pwd -L # will say real!
rmdir /tmp/real
pwd # says sym, though no directory exists
/bin/pwd # says error, as there isn't one
Что бы это ни стоило, я считаю, что весь «логический» бизнес только добавляет путаницы;старый путь был лучшим.Это правда, что символические ссылки могут сбивать с толку, но это делает его более запутанным, потому что любые открывающиеся файловые операции ... не делают то же самое, что любые изменения в каталогах, которые используют .. например, в этом довольно неприятном примере:
mkdir -p /tmp/dir/subdir
ln -s /tmp/dir/subdir /tmp/a
cd /tmp/a
ls .. # shows contents of /tmp/dir
(cd .. ; ls) # shows contents of /tmp
Чтобы избежать всего этого, вы можете поместить следующее в ваш ~ / .bashrc -o физический
Надеюсь, что это поможет!
С уважением, J.
PS Вышесказанное довольно специфично для Linux и Gnu bash;другие оболочки и системы похожи, но отличаются.