Вариант 1: более подходящее размещение символической ссылки

Вариант 1: более подходящее размещение символической ссылки

Я использую 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, чем этот ответ.

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