Поведение 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?
Ответы
Ответ 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, но большинство команд полагаются на ядро, чтобы справиться с ним).