Обратите внимание, что некоторые оболочки, в частности bash
, отслеживают, попали ли вы в данный каталог, преследуя символическую ссылку, и соответственно распечатывает текущий каталог.По крайней мере, bash
имеет параметры cd
, чтобы выполнить каталог физических или логических изменений:
cd [-L|-P] [dir]
Изменить текущий каталог на dir.Переменная HOME является каталогом по умолчанию. [...] Опция -P
говорит, что следует использовать физическую структуру каталогов вместо символьных ссылок (см. Также опцию -P
для встроенной команды set);опция -L
заставляет следовать символическим ссылкам.Аргумент -
эквивалентен $ OLDPWD.Если используется непустое имя каталога из CDPATH, или если -
является первым аргументом, и смена каталога прошла успешно, абсолютный путь нового рабочего каталога записывается в стандартный вывод.Возвращаемое значение равно true, если каталог был успешно изменен;иначе false.
В показанном сценарии, где /usr/spool
является символической ссылкой на /var/spool
, тогда:
$ pwd
/
$ cd /usr/spool/uucppublic
/usr/spool/uucppublic
$ cd -L ..
/usr/spool
$ cd /usr/spool/uucppublic
/usr/spool/uucppublic
$ cd -P ..
/var/spool
$
Для большинства людей простая cd ..
будет делать так же, как cd -L ..
.Вы можете выбрать bash
сделать то же самое, что и cd -P ..
, вместо этого, если вы предпочитаете (используя set -P
или set -L
).
Процесс поиска имени текущего каталога также следует понимать,Логически процесс (ядро) открывает текущий каталог (.
) и считывает номер инода (и номер устройства).Затем он открывает родительский каталог (..
) и считывает записи из него, пока не найдет один из них с соответствующим номером инода (и номером устройства).Это тогда дает ему последний компонент имени пути.Теперь он может повторять процесс, находя номер инода следующего каталога и открывая родительский каталог (../..
) и т. Д., Пока не достигнет корневого каталога (где номер индекса для .
и ..
то же самое, и значение обычно 2).Обратите внимание, что это работает даже в точках монтирования.Остерегайтесь автоматически смонтированных удаленных (NFS) файловых систем;это может быть очень медленным, если вы сканируете каталог, содержащий несколько сотен автоматически подключенных машин - так как наивный план поиска выше монтирует все машины, пока не найдет правильный.Итак, фактические функции getcwd()
умнее этого, но это объясняет, как найти путь к текущему каталогу.И это также показывает, почему процесс не встретит /usr/spool
при оценке каталога в /var/spool/uucppublic
- он просто никогда не откроет каталог /usr
.
Обратите внимание, что функция realpath()
(системный вызов) занимаетимя, возможно, ссылающееся на символические ссылки и преобразующее его в имя, которое вообще не содержит символических ссылок.Пройдя /usr/spool/uucppublic
, он вернет /var/spool/uucppublic
, например.