ls .. не работает должным образом с символическими ссылками

ls .. не работает должным образом с символическими ссылками

У меня есть каталоги, настроенные примерно так

~/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если вы хотите получить то, что ожидаете. zshoption CHASE_DOTSпомогает вам в этом.

Вообще говоря, симлинки на каталоги — грязное дело. Для критических и полупостоянных приложений лучше использовать mount --bind.

решение2

Поскольку вы отметили свой вопрос тегом , zshя предполагаю, что мы говорим об этой оболочке.

Скорее всего, вы установили (напрямую или косвенно с помощью внешнего скрипта вроде oh-my-zsh) переменные CHASE_LINKSи/или CHASE_DOTS. Чтобы убедиться в этом, запустите setopt | grep -i chaseи посмотрите, указаны ли они. Если да, просто отмените их установку:

unsetopt CHASE_DOTS
unsetopt CHASE_LINKS

Связанный контент