1

Я использую macOS и моя оболочка Zsh. По умолчанию домашний каталог моей системы - /Users/njohn . Я создал символическую ссылку на этот путь, /usr/local/home . Я положил HOME="/usr/local/home" в мой .zshrc . Я сделал это для того, чтобы сначала я мог быстро cd .. из своего домашнего каталога, и я буду в /usr/local где находятся все мои пакеты homebrew и файлы конфигурации. Это действительно простой ярлык. Мне также нравится, когда я могу использовать cd и прийти к своему пути с символическими ссылками, а не к обычному пути, который находится далеко в файловой системе от вещей, к которым я хотел бы чувствовать себя ближе.

Может ли это что-нибудь сломать? Есть ли более безопасный или лучший способ сделать то же самое?

1 ответ1

0

Отказ от ответственности: я не использую и не использовал 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 чем этот ответ.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .