Dove posizionare le asserzioni della variabile $ PATH in zsh?


111

Mi piace zsh, ma non sono sicuro di dove collocare le mie $PATHe altre affermazioni variabili? Trovo che siano sparsi tra i file .zshrc .zprofile .bashrc .bash_profilee talvolta raddoppiati.

Mi rendo conto che avere nulla all'interno dei bashfile non ha molto senso visto che sto usando zsh, ma esattamente dove dovrei essere effettuato il mio rvm, python, nodeecc aggiunte alla mia $PATH?

C'è un file specifico che dovrei usare (cioè .zshenvche attualmente non esiste nella mia installazione), uno di quelli che sto usando attualmente, o ha importanza?

Risposte:


148

tl; versione dr: usa ~/.zshrc

E leggi la pagina man per capire le differenze tra:

~/.zshrc, ~/.zshenve ~/.zprofile.


Per quanto riguarda il mio commento

Nel mio commento allegato alla risposta data da kev , ho detto:

Questo sembra non essere corretto - / etc / profile non è elencato in nessuna documentazione zsh che riesco a trovare.

Questo risulta essere parzialmente errato: /etc/profile potrebbe essere fornito da zsh. Tuttavia , ciò si verifica solo se zshè "invocato come sho ksh"; in queste modalità di compatibilità:

I soliti script di avvio / arresto di zsh non vengono eseguiti. Shell di login sorgente / etc / profile seguito da $ HOME / .profile. Se la variabile di ambiente ENV è impostata al richiamo, $ ENV viene originato dopo gli script del profilo. Il valore di ENV è soggetto all'espansione dei parametri, alla sostituzione dei comandi e all'espansione aritmetica prima di essere interpretato come un percorso. [ man zshall, "Compatibility" ].

Il collegamento ArchWiki ZSH dice:

All'accesso, Zsh genera i seguenti file in questo ordine:
/ etc / profile
Questo file viene fornito da tutte le shell compatibili con Bourne al momento dell'accesso

Questo implys che /etc/profileè sempre leggere dal zshmomento del login - io non ho alcuna esperienza con il progetto Arch Linux; il wiki potrebbe essere corretto per quella distribuzione, ma generalmente non lo è . Le informazioni non sono corrette rispetto alle pagine di manuale di zsh e non sembrano applicarsi a zsh su OS X (i percorsi $PATHimpostati in /etc/profilenon arrivano alle mie sessioni zsh).



Per rispondere alla domanda:

dove esattamente dovrei posizionare le mie aggiunte rvm, python, node ecc al mio $ PATH?

In generale, vorrei esportare il mio $PATHda ~/.zshrc, ma vale la pena di avere una lettura della zshall pagina man, in particolare la sezione "avvio / arresto FILES" - ~/.zshrcsi legge per interattive conchiglie, che può o non può soddisfare le vostre esigenze - se si desidera che il $PATHper ogni zshshell invocata da te (sia interactivee non, sia logine non, ecc.), quindi ~/.zshenvè un'opzione migliore.

C'è un file specifico che dovrei usare (ad es. .Zshenv che attualmente non esiste nella mia installazione), uno di quelli che sto utilizzando attualmente, o ha importanza?

Ci sono un sacco di file letti all'avvio (controlla le manpagine collegate ), e c'è una ragione per questo: ogni file ha la sua posizione particolare (impostazioni per ogni utente, impostazioni per utente specifico, impostazioni per shell di accesso, impostazioni per ogni shell, eccetera).
Non preoccuparti di ~/.zshenvnon esistere: se ne hai bisogno, fallo e verrà letto.

.bashrce non.bash_profile vengono letti da , a meno che tu non li trovi esplicitamente da fonti o simili; la sintassi tra e non è sempre compatibile. Entrambi e sono progettati per le impostazioni, non per le impostazioni.zsh~/.zshrcbashzsh.bashrc.bash_profilebashzsh


3
Grazie per la tua risposta più che esauriente simont. Strano che tu dica .bashrce .bash_profilenon sia letto da zshcome attualmente ho la mia rvmaggiunta a $PATHin .bashrce la mia pythonaggiunta in .bash_profile, ed entrambe vengono aggiunte bene. In ogni caso, sposterò tutte le mie $PATHesportazioni in ~/.zshrcquanto tutta la mia altra zshconfigurazione è ospitata lì. Devo ammetterlo, non ho molta familiarità con i diversi tipi di conchiglie. Dalla lettura dei link che hai postato, immagino di utilizzare una shell interattiva, ma leggerò oltre per esserne sicuro ... Grazie ancora!
stefmikhail

30

Ecco i documenti dalle pagine man di zsh nella sezione 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.

Da questo possiamo vedere che l'ordine di lettura dei file è:

/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

Puoi ottenere maggiori informazioni qui .


18

Ho avuto un problema simile (nel comando del terminale bash funzionava correttamente ma zsh ha mostrato un errore di comando non trovato)

Soluzione:


incolla semplicemente quello che stavi incollando prima in ~ / .bashrc in:

~/.zshrc
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.