Предполагая, что вы используете Bash, который имеет pwd
как встроенный 1 , происходит следующее: команда cd
запускает оболочку для обновления информации о текущий каталог. Пока вы не запустите cd
, оболочка будет думать, что текущий каталог не изменилась, поэтому она не пытается получить свой новый путь.
Кстати, чтобы немного расширить ответ Gnouc , в выпуске 6 базовых спецификаций Open Group в переменных среды говорится:
PWD
[...] представляет собой абсолютный путь к текущему рабочему каталогу. Он не должен содержать никаких компонентов имени файла, состоящих из точек или точек. Значение устанавливается утилитойcd
.
С другой стороны, если вы запустите внешнюю команду / bin / pwd
, вы получите новое имя текущего каталога. Почему так происходит? Команда pwd
из coreutils выполняет некоторые проверки корректности переменной среды PWD
и не печатает ее, если она недействительна. Подробности можно найти
в исходном коде функции logical_getcwd
(из coreutils версии 8.23).
Другая команда, которую вы можете использовать для получения канонического пути к текущему каталогу, - это readlink -f.
2 .
[ciupicri@host ttt]$ pwd
/tmp/ttt
[ciupicri@host ttt]$ mv ../ttt ../tttt
[ciupicri@host ttt]$ pwd
/tmp/ttt
[ciupicri@host ttt]$ /bin/pwd
/tmp/tttt
[ciupicri@host ttt]$ readlink -f .
/tmp/tttt
1 Запуск типа pwd
может подтвердить это.
2 Из справочной страницы readlink : -f
, - canonicalize
canonicalize путем рекурсивного перехода по каждой символической ссылке в каждом компоненте данного имени ; все компоненты, кроме последнего, должны существовать.
Очевидно, это была ошибка в ядре. Исправлено в https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/drivers/scsi/storvsc_drv.c?id=e86fb5e8ab95f10ec5f2e9430119d5d35020c951