2
$ cd ~
$ ln -s /real/folder symbolic_link

$ cd symbolic_link
$ cd ..
$ ls -l
symbolic_link -> /real/folder/

$ cd symbolic_link
$ ls -l ..
folder

Другими словами, почему поведение cd .. отличается от ls .. когда вы находитесь в символьном связанном каталоге?

1 ответ1

3

Ваша оболочка отслеживает символические ссылки, которые привели вас к вашему текущему рабочему каталогу. cd является встроенной оболочкой и help cd состояниям (пример из bash):

Опции:
-L принудительно использовать символические ссылки: разрешать символические ссылки в DIR после обработки экземпляров ..
-P использовать структуру физического каталога без следующих символических ссылок: разрешать символические ссылки в DIR перед обработкой экземпляров ..
[...]
По умолчанию следует переходить по символическим ссылкам, как если бы был указан -L .

Вы можете попробовать cd -P .. и увидеть разницу. Другой пример - pwd -L и pwd -P (в то время как pwd также является встроенной оболочкой).

Обратите внимание, что поведение по умолчанию можно изменить с помощью set -P и set +P См. help set для более подробной информации.

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

(cd -L .. && ls -l)

В основном мы используем cd для изменения текущего рабочего каталога относительно символьных ссылок (и я явно использовал для этого опцию -L по умолчанию), затем вызываем ls -l . Оператор && означает, что ls будет выполняться только в случае успеха cd . Скобки () заставляют все, что внутри, выполняться в подоболочке. Это команда trick: cd влияет только на эту подоболочку, и в вашей основной оболочке ничего не меняется, нет необходимости возвращать cd .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .