Вопрос по bash, symlink, linux, filesystems – Поведение CD / Bash на символических ссылках

25

Предположим, у меня есть папки ~ / a / b в моей домашней папке, а папка b содержит символическая ссылка на «...» именованная "символическая ссылка". Затем я выполняю следующие действия в Баш:

<code>[email protected]:~$ cd a/b/symlink
[email protected]:~/a/b/symlink$ pwd -P
/home/hm/a
[email protected]:~/a/b/symlink$ cd ..
[email protected]:~/a/b$ pwd -P
/home/hm/a/b
</code>

pwd -P печатает текущий рабочий каталог, разыменовывая все символические ссылки. Почему рабочий каталог / home / hm / a / b находится в конце, а не / home / hm?

Ваш Ответ

2   ответа
5

bash отслеживает логический текущий путь к каталогу, как показано в вашей подсказке, и интерпретирует такие вещи, какcd .. в соответствии с этим. Это делает вещи немного более последовательными, если вы используете только такие пути вcd (или жеpushd) ценой непредвиденных событий, если вы ожидаете, что то же самое произойдет с путями в аргументах команд (или внутри команд;emacs а такжеvim имеют собственные настраиваемые правила для обработки символических ссылок, но большинство команд полагаются на ядро, чтобы справиться с этим).

26

bash является "дружественным"; когда тыcd /into/a/symlink/оболочка запоминает старое местоположение (в$OLDPWD) и буду использоватьthat каталог, когда выcd .. при условии, что вы хотите вернуться в каталог, в котором вы только что были.

Если вы хотите использоватьreal .., то вы также должны использоватьcd -P:

          The -P option says to use the physical directory
          structure instead of following symbolic links (see
          also the -P option to the set builtin command);
          the -L option forces symbolic links to be followed.
$ cd
$ cd a/b/symlink
$ cd -P ..
$ pwd -P
/home/sarnold
$ 
Я согласен, что я не думаю, что OLDPWD на самом деле что-то здесь делает. Я проверил это, "cd" спустив цепочку символических ссылок на три уровня глубиной, а затем выполнил "cd .." несколько раз. Работало нормально. Если использовать OLDPWD, он не будет работать. OLDPWD запоминает только один каталог и не может быть использован для возврата более чем одного каталога. Таким образом, OLDPWD не используется.
Ссылка наOLDPWD в твоем ответе неактуально.OLDPWD используетсяcd - (неcd ..).
К вашему сведению, вы можете использоватьset -o physical или жеset -P чтобы сделать это поведение постоянным.
.. Должен отметить, что реализация, вероятно, более соответствует описанию @ geekosaur; Я не ожидал перезаписиOLDPWD с вашей собственной ценностью будет фактически влиятьcd .. поведение.
@ Леон, даже в том случае, если вы просмотрели символическую ссылку на каталог?

Похожие вопросы