Я использую macOS, а моя оболочка — zsh. По умолчанию домашний каталог моей системы — /Users/njohn
. Я создал символическую ссылку на этот путь, /usr/local/home
. Я вставил HOME="/usr/local/home"
туда свой .zshrc
. Я сделал это для того, чтобы, во-первых, я мог быстро cd ..
из своего домашнего каталога попасть туда, /usr/local
где находятся все мои пакеты homebrew и файлы конфигурации. Это действительно простой ярлык. Мне также нравится возможность использовать cd
и приходить к моему символическому пути, а не к обычному, который находится далеко в файловой системе от вещей, к которым я хотел бы чувствовать себя ближе.
Может ли это что-нибудь сломать? Есть ли более безопасный или лучший способ сделать то же самое?
решение1
Отказ от ответственности: Я не использую и не пользовался 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
опция позволяет вам опустить ~
for именованных каталогов при использовании 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
войти в один из этих подкаталогов из любой точки мира, без необходимости вводить какой-либо префикс!
Как уже упоминалось, вы можете объединить это с именованными каталогами. Чтобы вытащить пример из моих собственных dotfiles:
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
, чем этот ответ.