Понимание прохождения символьных ссылок каталога и родительского каталога

9

Допустим, у вас есть каталоги /dir1и /dir2/linked, где последний является символической ссылкой на первый.

Когда вы cdв linkedи pwdвы получите выход /dir2/linked. Если вы тогда cd .., вы будете надеты /dir2. Такое поведение согласуется с концепцией того, что вы были /dir2/linkedраньше. Однако, насколько я понимаю, родительский каталог ( ..) любого каталога хранится в каталоге inode (то есть: физически на диске). Очевидно, что поскольку /dir2/linkedэто действительно /dir1, родительский каталог в inode должен быть/

Чтобы еще больше усложнить дело, пока внутри /dir2/linked, выходы ls ..и cd .. ; ls .разные! Кажется, что он cdчтит символический путь, а ls"физический" путь. Как уже упоминалось в этом вопросе , есть cd -Pдля этого варианта использования, хотя.

man pwd упоминает "физические" и "логические" рабочие каталоги, но у меня все еще есть несколько вопросов на данный момент:

  • Всегда ли это поведение обеспечивается PWDпеременной среды, как упомянуто в man pwd?
  • Почему по умолчанию cdи lsимеют различное поведение, если они обе команды оболочки (то есть: не программы)?
  • Использует ли типичная программа (не команда оболочки) PWDвместо физического пути? Я понимаю, что это до реализации, но есть ли какое-то правило?
goncalopp
источник
1
Много информации в этом ответе
Стефан Шазелас
1
@ StéphaneChazelas Это фантастический ответ, спасибо, что поделились
goncalopp
Пожалуйста. Пожалуйста, не стесняйтесь копировать и вставлять текст оттуда, если вы планируете сами ответить на свой вопрос.
Стефан Шазелас

Ответы:

5

bash «знает» о символических ссылках и отслеживает эту информацию, когда вы используете символическую ссылку для входа в каталог.

Вы можете проверить это, выполнив в своем примере следующее:

$ cd /dir2
$ cd linked
$ pwd
/dir2/linked
$ PWD='' bash -c pwd
/dir1

Вам необходимо запустить bash с пустой PWDпеременной, иначе он использует этот трюк для отображения «поддельного» пути.

Обратите внимание , что ls это отдельная программа , и как таковые не имеет знания в Bash , как вы прибыли в текущем каталоге, так ls ..будет просто показать содержимое реального родительского каталога, а не по отношению к линку вы следовали.

Большинство программ не будут зависеть от переменной среды, так CWDкак существует много способов запуска программ, поскольку оболочка bash - это всего лишь один, поэтому не стоит ожидать, CWDчто она содержит правильное значение (попробуйте установить CWDчто-то не так, прежде чем делать bash -c pwd, вы можете увидеть, как он проверяет значение для здравомыслия).

wurtel
источник
полезно знать, что вы так ясно PWD, но это само по себе не отвечает на вопросы, которые я упомянул
goncalopp
Добавил еще немного информации.
wurtel
Я был под впечатлением lsот bash, но вы helpменя и убедили в обратном. Это проясняет ситуацию, спасибо!
goncalopp
PWDявляется стандартным в POSIX. Вы можете положиться на это, чтобы быть установленным. Если он не установлен, вещи могут сломаться, например, pwd утилита : см. Также переменные среды .
Darkfeline