Допустим, у вас есть каталоги /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
вместо физического пути? Я понимаю, что это до реализации, но есть ли какое-то правило?
источник
Ответы:
bash
«знает» о символических ссылках и отслеживает эту информацию, когда вы используете символическую ссылку для входа в каталог.Вы можете проверить это, выполнив в своем примере следующее:
Вам необходимо запустить bash с пустой
PWD
переменной, иначе он использует этот трюк для отображения «поддельного» пути.Обратите внимание , что
ls
это отдельная программа , и как таковые не имеет знания в Bash , как вы прибыли в текущем каталоге, такls ..
будет просто показать содержимое реального родительского каталога, а не по отношению к линку вы следовали.Большинство программ не будут зависеть от переменной среды, так
CWD
как существует много способов запуска программ, поскольку оболочка bash - это всего лишь один, поэтому не стоит ожидать,CWD
что она содержит правильное значение (попробуйте установитьCWD
что-то не так, прежде чем делатьbash -c pwd
, вы можете увидеть, как он проверяет значение для здравомыслия).источник
PWD
, но это само по себе не отвечает на вопросы, которые я упомянулls
от bash, но выhelp
меня и убедили в обратном. Это проясняет ситуацию, спасибо!PWD
является стандартным в POSIX. Вы можете положиться на это, чтобы быть установленным. Если он не установлен, вещи могут сломаться, например,pwd
утилита : см. Также переменные среды .