Где разместить утверждения переменной $ PATH в zsh?

111

Мне нравится zsh, но я не уверен, где разместить свои $PATHутверждения и утверждения о других переменных? Я обнаружил, что они разбросаны по файлам .zshrc .zprofile .bashrc .bash_profile, а иногда и удваиваются.

Я понимаю , что имея ничего внутри bashфайлов не имеет большого смысла , видя , как я использую zsh, но где именно я должен быть размещая мои rvm, python, и nodeт.д. дополнения Мои $PATH?

Есть ли конкретный файл, который я должен использовать (т.е. .zshenvкоторый в настоящее время не существует в моей установке), один из тех, которые я использую в настоящее время, или это вообще имеет значение?

stefmikhail
источник

Ответы:

148

tl; dr версия: использовать ~/.zshrc

И прочитайте справочную страницу, чтобы понять различия между:

~/.zshrc, ~/.zshenvи ~/.zprofile.


Что касается моего комментария

В моем комментарии, приложенном к ответу Кева , я сказал:

Это кажется неправильным - / etc / profile не указан ни в какой документации по zsh, которую я могу найти.

Это частично неверно: /etc/profile может быть получен от zsh. Однако это происходит, только если zsh"вызывается как shили ksh"; в этих режимах совместимости:

Обычные сценарии запуска / завершения работы zsh не выполняются. Источник оболочки входа / etc / profile, за которым следует $ HOME / .profile. Если переменная среды ENV установлена ​​при вызове, $ ENV берется после скриптов профиля. Значение ENV подвергается расширению параметров, подстановке команд и арифметическому расширению перед интерпретацией как имя пути. [ man zshall, "Совместимость" ].

Ссылка ArchWiki ЗШ говорит:

При входе в систему Zsh создает следующие файлы в следующем порядке:
/ etc / profile
Этот файл создается всеми Bourne-совместимыми оболочками при входе в систему.

Это implys , что /etc/profileэто всегда читают по zshпри входе в систему - у меня нет никакого опыта работы с проектом Arch Linux; wiki может быть правильным для этого дистрибутива, но в целом это не так . Информация является неверным по сравнению с ЗШЕМ справочных страниц, и , кажется, не применяется к ЗШУ на OS X (пути в $PATHнаборе в /etc/profileне сделать его мой ЗШ сессии).



Чтобы ответить на вопрос:

где именно я должен размещать мои дополнения rvm, python, node и т. д. к моему $ PATH?

Как правило, я бы экспортировал свой файл$PATH from ~/.zshrc, но стоит прочитать справочную страницу zshall , в частности раздел «ФАЙЛЫ ЗАПУСКА / ВЫКЛЮЧЕНИЯ» - ~/.zshrcчитается для интерактивных оболочек, которые могут или не могут соответствовать вашим потребностям - если вы хотите, чтобы $PATHдля каждая zshзапущенная вами оболочка (обе, interactiveа не обе, loginи т. д.) ~/.zshenv- лучший вариант.

Есть ли конкретный файл, который я должен использовать (например, .zshenv, которого в настоящее время нет в моей установке), один из тех, которые я использую в настоящее время, или это вообще имеет значение?

При запуске читается куча файлов (проверьте связанные manстраницы), и для этого есть причина - каждый файл имеет свое определенное место (настройки для каждого пользователя, настройки для конкретных пользователей, настройки для оболочек входа, настройки для каждой оболочки, и т.д).
Не беспокойтесь о том, что ~/.zshenvне существует - если вам это нужно, сделайте это, и это будет прочитано.

.bashrcи .bash_profileкоторые не читают zsh, если вы явно не источник их ~/.zshrcили аналогичный; синтаксис между bashи zshявляется не всегда совместимы. Оба .bashrcи .bash_profileпредназначены для bashнастроек, а не zshнастроек.

Симонт
источник
3
Спасибо за более чем обстоятельный ответ, simont. Странно , что вы говорите , .bashrcи .bash_profileне читаются , zshкак я в настоящее время у меня rvmдополнение к $PATHв .bashrc, и мое pythonдобавление в .bash_profile, и оба они добавляются только штрафом. В любом случае, я собираюсь переместить все мои $PATHэкспортные файлы в эту папку, так ~/.zshrcкак вся моя другая zshконфигурация находится там. Должен признаться, я не слишком знаком с различными типами снарядов. Прочитав опубликованные вами ссылки, я предполагаю, что использую интерактивную оболочку, но я буду читать дальше, чтобы быть уверенным ... Еще раз спасибо!
Стефмихаил
30

Вот документы из страниц руководства zsh в разделе ФАЙЛЫ ЗАПУСКА / ВЫКЛЮЧЕНИЯ.

   Commands  are  first  read from /etc/zshenv this cannot be overridden.
   Subsequent behaviour is modified by the RCS and GLOBAL_RCS options; the
   former  affects all startup files, while the second only affects global
   startup files (those shown here with an path starting with  a  /).   If
   one  of  the  options  is  unset  at  any point, any subsequent startup
   file(s) of the corresponding type will not be read.  It is also  possi-
   ble  for  a  file  in  $ZDOTDIR  to  re-enable GLOBAL_RCS. Both RCS and
   GLOBAL_RCS are set by default.

   Commands are then read from $ZDOTDIR/.zshenv.  If the shell is a  login
   shell,  commands  are  read from /etc/zprofile and then $ZDOTDIR/.zpro-
   file.  Then, if the  shell  is  interactive,  commands  are  read  from
   /etc/zshrc  and then $ZDOTDIR/.zshrc.  Finally, if the shell is a login
   shell, /etc/zlogin and $ZDOTDIR/.zlogin are read.

Из этого мы видим, что файлы заказов читаются:

/etc/zshenv    # Read for every shell
~/.zshenv      # Read for every shell except ones started with -f
/etc/zprofile  # Global config for login shells, read before zshrc
~/.zprofile    # User config for login shells
/etc/zshrc     # Global config for interactive shells
~/.zshrc       # User config for interactive shells
/etc/zlogin    # Global config for login shells, read after zshrc
~/.zlogin      # User config for login shells
~/.zlogout     # User config for login shells, read upon logout
/etc/zlogout   # Global config for login shells, read after user logout file

Вы можете получить больше информации здесь .

Джор
источник
18

У меня была аналогичная проблема (в терминале команда bash работала правильно, но zsh показала, что команда не найдена)

Решение:


просто вставьте то, что вы ранее вставляли в ~ / .bashrc, в:

~/.zshrc
abe312
источник