Gdzie umieścić asercje zmiennej $ PATH w zsh?


111

Uwielbiam zsh, ale nie jestem pewien, gdzie umieścić moje $PATHi inne zmienne asercje? Uważam, że są one rozproszone między plikami .zshrc .zprofile .bashrc .bash_profile, a czasami podwajane.

Zdaję sobie sprawę, że o cokolwiek wewnątrz bashplików nie ma większego sensu, skoro używam zsh, ale gdzie dokładnie powinienem być umieszczenie moich rvm, python, nodeitp uzupełnień moim $PATH?

Czy jest jakiś konkretny plik, którego powinienem używać (tj. .zshenvKtórego obecnie nie ma w mojej instalacji), jeden z tych, których aktualnie używam, czy w ogóle ma to znaczenie?

Odpowiedzi:


148

tl; wersja dr: użyj ~/.zshrc

I przeczytać stronę man , aby zrozumieć różnice pomiędzy:

~/.zshrc, ~/.zshenvi ~/.zprofile.


Odnośnie mojego komentarza

W komentarzu dołączonym do odpowiedzi, której udzielił Kev , powiedziałem:

Wygląda na to, że jest to nieprawidłowe - pliku / etc / profile nie ma w żadnej dokumentacji zsh, którą mogę znaleźć.

Okazuje się, że jest to częściowo błędne: /etc/profile może pochodzić z zsh. Jednak dzieje się tak tylko wtedy, gdy zshjest „wywołane jako shlub ksh”; w tych trybach zgodności:

Zwykłe skrypty uruchamiania / zamykania zsh nie są wykonywane. Powłoki logowania source / etc / profile, a następnie $ HOME / .profile. Jeśli zmienna środowiskowa ENV jest ustawiona przy wywołaniu, kod $ ENV jest pobierany po skryptach profilu. Wartość ENV podlega interpretacji parametrów, podstawianiu poleceń i interpretacji wyrażeń arytmetycznych, zanim zostanie zinterpretowana jako nazwa ścieżki. [ man zshall, "Compatibility" ].

Link ArchWiki ZSH mówi:

Podczas logowania Zsh pobiera następujące pliki w następującej kolejności:
/ etc / profile
Ten plik jest pobierany przez wszystkie powłoki kompatybilne z Bourne po zalogowaniu

Ten implys że /etc/profilejest zawsze odczytywane przez zshprzy logowaniu - Nie mam żadnego doświadczenia z projektu Arch Linux; wiki może być poprawne dla tej dystrybucji, ale generalnie nie jest poprawne. Informacje niepoprawne w porównaniu ze stronami podręcznika zsh i wydają się nie mieć zastosowania do zsh w systemie OS X (ścieżki w $PATHustawieniu /etc/profilenie prowadzą do moich sesji zsh).



Aby odpowiedzieć na pytanie:

gdzie dokładnie powinienem umieścić moje dodatki rvm, python, node itp. w mojej $ PATH?

Generalnie chciałbym wyeksportować $PATHz ~/.zshrc, ale warto o odczyt z zshall strony człowieka, zwłaszcza w sekcji „uruchamianie / zamykanie FILES” - ~/.zshrcto lektura obowiązkowa dla interaktywnych muszli, które mogą lub nie mogą własnych potrzeb - jeśli chcesz, aby $PATHna każda zshpowłoka wywołana przez Ciebie (zarówno interactivei nie, jak logini nie, itd.) ~/.zshenvjest lepszym rozwiązaniem.

Czy istnieje konkretny plik, którego powinienem używać (np. .Zshenv, którego obecnie nie ma w mojej instalacji), jeden z tych, których obecnie używam, czy w ogóle ma to znaczenie?

Jest kilka plików odczytywanych podczas uruchamiania (sprawdź powiązane manstrony) i jest ku temu powód - każdy plik ma swoje określone miejsce (ustawienia dla każdego użytkownika, ustawienia dla użytkownika, ustawienia powłok logowania, ustawienia dla każdej powłoki, itp).
Nie martw się, że ~/.zshenvnie istnieje - jeśli tego potrzebujesz, zrób to, a zostanie przeczytane.

.bashrci nie.bash_profile są czytane przez użytkownika , chyba że wyraźnie je pozyskujesz z lub w podobny sposób; składnia pomiędzy i to nie zawsze zgodne. Obie i są przeznaczone do ustawień, a nie ustawień.zsh~/.zshrcbashzsh.bashrc.bash_profilebashzsh


3
Dzięki za więcej niż dokładną odpowiedź simont. Dziwne, że można powiedzieć .bashrci .bash_profilenie są odczytywane przez zshjak ja obecnie mam mój rvmdodatek do $PATHw .bashrc, a mój pythondodatek w .bash_profile, i oba są dodawane dobrze. W każdym razie zamierzam przenieść wszystkie moje $PATHeksporty do, ~/.zshrcponieważ cała moja inna zshkonfiguracja jest tam przechowywana. Muszę przyznać, że nie jestem zbyt zaznajomiony z różnymi typami muszli. Po przeczytaniu linków, które zamieściłeś, domyślam się, że używam interaktywnej powłoki, ale dla pewności przeczytam dalej ... Jeszcze raz dziękuję!
stefmikhail

30

Oto dokumentacja ze stron man zsh w sekcji STARTUP / SHUTDOWN FILES.

   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.

Z tego widać, że odczytywane są pliki zamówień:

/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

Więcej informacji znajdziesz tutaj .


18

Miałem podobny problem (w poleceniu terminalu bash działało poprawnie, ale zsh pokazał błąd nie znaleziono polecenia)

Rozwiązanie:


po prostu wklej to, co wcześniej wklejałeś w ~ / .bashrc do:

~/.zshrc
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.