Как оболочка узнает, в каком каталоге она находится? - PullRequest
4 голосов
/ 09 сентября 2010

Я пытался выяснить, как оболочка знает, в каком каталоге вы сейчас находитесь. Я знаю, что есть переменная окружения $PWD, но когда я пытаюсь изменить ее вручную, она меняет то, что моя оболочка показывает в приглашении, нотакие команды, как ls и cd, не затрагиваются.

cd - это внутренняя команда оболочки, поэтому я могу понять, что она может использовать информацию, хранящуюся в памяти оболочки, но ls является внешней и все еще выполняется ls без чего-либо даст мне каталог, в котором я был изначально, независимо от того, что я делаю с $PWD.

Ответы [ 5 ]

12 голосов
/ 09 сентября 2010

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

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

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

9 голосов
/ 09 сентября 2010

Оболочка устанавливает эту переменную, но хранит знания внутренне (поэтому вы не можете сделать cd внешней программой, она должна быть встроенной).Приглашение оболочки составляется непосредственно перед тем, как оно отображается каждый раз, и вы указали, используя $PWD в своем, поэтому оболочка считывает это в.

Помните: оболочка - это просто программа, как и любая другая программа,Он может --- и хранит --- вещи в переменных.


Как AndiDog и Джон указывают на unix-подобные системы (т.е. включая linux)) фактически поддерживает рабочий каталог для каждого процесса посредством набора системных вызовов.Однако хранилище все еще обрабатывается локально.

3 голосов
/ 09 сентября 2010

Ядро Linux хранит текущий каталог каждого процесса.Вы можете найти его в файловой системе / proc (например, "/ proc / 1 / cwd" для процесса инициализации).

Текущий каталог можно изменить с помощью системного вызова chdir и получить с помощью getcwd.

1 голос
/ 09 сентября 2010

Текущий каталог - это свойство работающей программы (процесса), которое наследуется процессами, созданными этим процессом.Изменение текущего каталога производится с помощью вызова операционной системы.Оболочка отображает операцию cd на этот системный вызов.Когда вы пишете внешнюю программу, такую ​​как ls, эта программа наследует текущий каталог.

Переменная $PWD показывает, как оболочка показывает вам текущий каталог, чтобы вы использовали его в качестве переменной, если вам это нужно.,Его изменение не действует в реальном текущем каталоге самой оболочки.

1 голос
/ 09 сентября 2010

Вы (OP) запускаете ls через командную оболочку, и любой запускаемый вами процесс запускается в контексте текущего рабочего каталога.Таким образом, каждый запускаемый вами процесс имеет свою собственную переменную $PWD (в некотором смысле).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...