Отказ от ответственности: я не использую и не использовал MacOS, поэтому я не совсем уверен, что, если таковые имеются, могут существовать неровности или тонкие различия между Mac и * nix.
Чтобы ответить на ваш вопрос, единственный сценарий, который я мог представить себе как "сломанный" при такой настройке, - это когда определенная программа пытается что-то сделать с вашим домашним каталогом, и она либо не следует по символическим ссылкам по умолчанию (либо вообще не следует по некоторым причинам), Если какая-либо гипотетическая программа попытается прочитать / записать какой-либо файл в вашем домашнем каталоге, и она не разрешит вашу символьную ссылку /usr/local/home
, скорее всего, все пойдет не так. Хотя вероятность такого сценария выше моей.
Тем не менее, я думаю, что вам лучше воспользоваться подходом, который не изменяет переменную $HOME
. Изменение переменной $HOME
на нечто, отличное от того, что система понимает под вашим домашним каталогом в течение срока службы каждой интерактивной оболочки, которую вы запускаете, является уродливым, хакерским и неизбежно вызывает тонкие проблемы. Я предоставлю вам три лучших варианта.
Вариант 1: более подходящая символическая ссылка
Если вы хотите использовать символическую ссылку, просто создайте символическую ссылку на /usr/local
из вашего домашнего каталога, избавьтесь от имеющейся у вас ссылки /usr/local/home
и удалите строку, изменяющую переменную $HOME
из вашего .zshrc
. Например:
% [~] ln -s /usr/local uloc
% [~] cd uloc
% [~/uloc] realpath .
/usr/local
Как и в настоящее время, вы можете быстро добраться до /usr /local из вашего домашнего каталога, за исключением того, что вам не нужно менять $HOME
.
Вариант 2: Именованные каталоги
Поскольку вы используете Zsh, я бы порекомендовал использовать именованный каталог. Вместо HOME=/usr/local/home
сделайте что-то вроде следующего, заменив uloc
коротким именем по вашему выбору:
uloc=/usr/local
Затем вы можете быстро переключиться на этот каталог из любого места следующими способами:
# With no special options set
% cd ~uloc
# Slightly shorter
% setopt cdable_vars
% cd uloc
# Even shorter
% setopt cdable_vars auto_cd
% uloc
Как вы можете видеть, если у вас есть переменная , которая расширяется на пути, вы можете cd
на него в Zsh , если префикс с ~
характер, подобно тому , как вы можете использовать ~user
в качестве ярлыка для /home/user
Вы можете иметь столько именованных каталогов, сколько захотите, так что вы можете иметь быстрый доступ к любому часто используемому каталогу, а не только к /usr/local
как в вашем случае.
Опция cdable_vars
позволяет опустить именованных ~
каталогов при использовании cd
- диска, и auto_cd
означает , что если ввести "команду", которая фактически является каталогом именем или буквальным Zsh будет автоматически cd
в этот каталог. Комбинируя эти два, вы получаете быстрый доступ к нужному каталогу, где бы вы ни находились. В отличие от варианта 1, так как вы не полагаться на линке, cd
ывая этого имени каталога будет на самом деле поставить вас в этот каталог, так что pwd
будет возвращать /usr/local
и /Users/njohn/uloc
Вариант 3: Использование CDPATH
Этот подход может использоваться сам по себе или в сочетании с вариантом 2.
Вы также можете использовать $CDPATH
, которая является специальной переменной, такой как $PATH
которая содержит список каталогов. В отличие от $PATH
, каталоги в $CDPATH
будут использоваться как "корень" для относительных путей, данных для cd
если данный путь не найден в текущем каталоге. Для демонстрации рассмотрим следующее:
# Zsh ties lowercase variants of the *PATH variables together as arrays. See zshparam(1) for details
% [~/foo] cdpath=(/usr/local)
% [~/foo] ls
bar/ baz/
% [~/foo] cd share
% [/usr/local/share]
Поскольку в share
не было каталога с именем ~/foo
, Zsh обратился к $CDPATH
чтобы узнать, где share
может быть дочерним каталогом. Поскольку /usr/local
был в $CDPATH
, а share
- это дочерний каталог /usr/local
, вы можете использовать cd share
из ~/foo
. Вы также можете пойти глубже; например, если stuff
был подкаталогом /usr/local/share
, вы можете получить его, выполнив cd share/stuff
.
Примечание: в отличие от Bash, Zsh всегда просматривает текущий каталог, прежде чем пытаться каталоги в $CDPATH
, если только a .
входит в $CDPATH
. В этом случае Zsh строго соблюдает порядок каталогов в $CDPATH
.
Это дает вам еще больше удобства, так как, как вы сказали, вам часто требуется доступ к вашим пакетам и конфигам homebrew, вы можете cd
в один из этих подкаталогов из любой точки мира, не используя префикс!
Как уже упоминалось, вы можете комбинировать это с именованными каталогами. Чтобы взять пример из моих собственных файлов точек:
ZSH=~/.zsh
cdpath=(~/.zsh)
# I split my configuration up into separate files that live in separate
# directories, which all live under a 'modules' directory inside ~/.zsh
% [~] cd modules/directory
% [~ZSH/modules/directory] cd modules/git
% [~ZSH/modules/git]
Дальнейшее чтение
Я рекомендую познакомиться с Zsh и его многими функциями *. Вот некоторые справочные страницы и другие темы, которые вы можете посмотреть:
symlink(7)
- Подробно описывает символические ссылки и то, как они взаимодействуют.
zshexpn(1)
, "Статические именованные каталоги" - Объясняет именованные каталоги, а остальная часть справочной страницы описывает все формы расширения в Zsh.
zshparam(1)
, «ПАРАМЕТРЫ, ИСПОЛЬЗУЕМЫЕ ОБОЛОЧКОЙ» - включает в себя описания специальных переменных, таких как cdpath
и т.п.
zshoptions(1)
- Подробно описывает все опции, которые управляют поведением Zsh через встроенный setopt
. Содержит более подробные объяснения cdable_vars
и auto_cd
чем этот ответ.