Подтвердить что ты не робот

Поведение cd/bash по символическим ссылкам

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

[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

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

4b9b3361

Ответ 1

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

Если вы хотите использовать реальный .., вы также должны использовать 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
$ 

Ответ 2

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