Для процесса возможно опросить файловую систему, чтобы определить ее текущий рабочий каталог, используя метод, который является слишком сложным, чтобы быть в теме в качестве ответа на этот вопрос. Это то, что делают pwdпрограмма и getcwdфункция библиотеки. На заре Unix они были единственными способами узнать, каков ваш рабочий каталог. Вот часть ответа на ваш вопрос, которую я не могу найти ни в одном из других ответов или даже где-либо еще на этом сайте (после 42-секундного поиска):
- Когда оболочка запускается, она получает свой текущий рабочий каталог (возможно, путем вызова
getcwd).
После этого, всякий раз , когда вы делаете cd, pushdили popd, оболочка отслеживает рабочий каталог с помощью функции манипулирования строк. Например,
- Если ваш рабочий каталог
/home/simи вы печатаете cd .., оболочка вычисляет, что ваш рабочий каталог /home.
- Если ваш рабочий каталог
/home/simи вы печатаете cd ., оболочка вычисляет, что ваш рабочий каталог все еще /home/sim.
- Если ваш рабочий каталог
/home/simи вы печатаете cd aa, оболочка вычисляет, что ваш рабочий каталог /home/sim/aa- без проверки, aaявляется ли символическая ссылка.
Это позволяет сэкономить на стоимости звонков getcwd. Но это компромисс, поскольку он может привести к неверной информации.
- Команда
pwd(встроенная) просто отображает запомненное / вычисленное представление оболочки о том, что является рабочим каталогом.
- Кроме того, оболочка помещает запомненное / вычисленное представление о том, какой рабочий каталог находится в переменной среды PWD, для удобства пользовательских процессов. Процесс никогда не должен полагаться на это, если ему нужна точная информация.
Итак, суть в том, что оболочка может запутаться в том, где она находится. Но если вы набираете текст /bin/pwd, он запускается в отдельном процессе, который не имеет доступа к представлению оболочки о том, что такое рабочий каталог, и поэтому он определяет истинный рабочий каталог, по старинке. (Исключение: /bin/pwdпрограмма может посмотреть на переменную окружения PWD, и, очевидно, она это делает, когда вы указываете -L.) Вот еще один пример того, как оболочка может запутаться:
cd /home/sim/aa # Предположим , что /home, /home/simи/home/sim/aa
# все реальные каталоги (не символические ссылки).
pwd # Вывод: /home/sim/aaчто правильно.
mv ../aa ../bb
pwd # Вывод: /home/sim/aaчто неверно.
/bin/pwd # Вывод: /home/sim/bbчто правильно.
И, на всякий случай, если вам не ясно это, если вы печатаете ln -s . aaи cd aa, то ваш текущий рабочий каталог не изменился , больше, чем когда вы печатаете cd .- потому что, по сути, это то, что вы делаете, когда печатаете cd aa.