У меня есть каталоги, настроенные примерно так
~/code
~/code/src
~/code/build -> /path/to/somewhere/else
Последнее — символическая ссылка.
Если я сделаю это
cd ~/code/build
ls ..
затем я получаю листинг для /path/to/somewhere
, но издругие замечанияи по моему собственному опыту, я ожидал увидеть объявление о продаже ~/code
... Я готов поклясться, что раньше все было наоборот.
Я использую zsh и bash на Ubuntu. Есть ли для этого настройка или это глубоко укоренено в POSIX или что-то в этом роде?
решение1
Не в этом дело ls
. Дело в том, как работают символические ссылки. ..
Переносит вас в родительский каталог текущего каталога, каталог не знает, что вы попали в него через символическую ссылку. Оболочке приходится вмешиваться, чтобы предотвратить такое поведение. Для встроенной функции оболочки cd
есть специальная обработка, которая не просто вызывает chdir
, а запоминает полный путь к каталогу и пытается выяснить, что вам нужно. ls
Однако не является встроенной функцией. Оболочке приходится менять ..
путь на другой, прежде чем передавать его, ls
если вы хотите получить то, что ожидаете. zsh
option CHASE_DOTS
помогает вам в этом.
Вообще говоря, симлинки на каталоги — грязное дело. Для критических и полупостоянных приложений лучше использовать mount --bind
.
решение2
Поскольку вы отметили свой вопрос тегом , zsh
я предполагаю, что мы говорим об этой оболочке.
Скорее всего, вы установили (напрямую или косвенно с помощью внешнего скрипта вроде oh-my-zsh
) переменные CHASE_LINKS
и/или CHASE_DOTS
. Чтобы убедиться в этом, запустите setopt | grep -i chase
и посмотрите, указаны ли они. Если да, просто отмените их установку:
unsetopt CHASE_DOTS
unsetopt CHASE_LINKS