Для процесса возможно опросить файловую систему, чтобы определить ее текущий рабочий каталог, используя метод, который является слишком сложным, чтобы быть в теме в качестве ответа на этот вопрос. Это то, что делают 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
.