Каждый процесс имеет свой отдельный текущий рабочий каталог, который отслеживает система Linux. Это одна из частей информации, которой ОС управляет для каждого процесса. Системный вызов getcwd()
возвращает этот каталог.
Переменная окружения $PWD
отражает то, что getcwd()
было в последний раз, когда оболочка проверялась, но ее изменение фактически не меняет текущий каталог. Чтобы сделать это, оболочка должна будет вызвать chdir()
при изменении $PWD
, чего не делает.
Это также причина, по которой cd
должен быть встроенным в оболочку. Когда вы запускаете подпроцесс, этот дочерний процесс получает свой собственный рабочий каталог, поэтому, если бы cd
был исполняемым файлом, его вызовы chdir()
были бы бесполезны, поскольку это не изменило бы рабочий каталог его родителя. Это будет только изменение его собственного (недолговечного) рабочего каталога. Следовательно, cd
является встроенной оболочкой, чтобы избежать запуска подпроцесса.