Zsh non colpisce ~ / .profile

Ho appena installato zsh sul mio sistema Ubuntu. Sembra che zsh non esegua ~ / .profile su init. A mio avviso, questo dovrebbe essere un comportmento automatico. Che cosa mi manca?

.profile vs .zprofile

Zsh esegue ~/.zprofile , non ~/.profile , quando viene richiamato come shell di login. Il motivo è che zsh ha abbastanza incompatibilità con le shell standard per rompere gli script.

Zsh esegue ~/.profile se viene chiamato come sh o ksh . Ma se il tuo objective è get un prompt zsh quando accedi, questo non è un aiuto.

È ansible eseguire /bin/sh la shell di login e includere l' export SHELL=/bin/zsh nel ~/.profile . Quando apri un terminal, il terminal lancerà zsh (tranne che alcuni emulatori terminali non rispettano l'impostazione $SHELL ). Ma sarai ancora quando accedi a ssh. Questo può essere risolto includendo exec zsh alla fine di ~/.profile (questo sostituisce la shell in esecuzione con zsh), ma devi essere attento solo per farlo per gli accessi interattivi e non quando il ~/.profile è incluso da altri script come l'avvio della session X (un buon test è il nome del process genitore ottenuto da ps -o comm= $PPID : se è sshd o su , allora è sicuro exec ).

La soluzione più semplice per entrambi funzionare con zsh e run ~/.profile è creare un ~/.zprofile che entra nella modalità sh emulation mentre si esegue ~/.profile :

 emulate sh . ~/.profile emulate zsh 

Se hai abbastanza recente zsh (su Ubuntu, questo significa che shiny, credo), puoi semplificarlo per emulate sh -c '. ~/.profile' emulate sh -c '. ~/.profile' .

.zprofile vs .zshrc

Il file ~/.profile viene caricato da shell di login . La shell di login è il primo process che viene avviato quando si accede in modalità di text, ad esempio su una console di text o tramite ssh. Per impostazione predefinita, nella maggior parte delle macchine Linux, la shell di login è bash, ma puoi cambiarla con il command chsh o con un altro strumento come "User Settings" in Ubuntu. Quando è una shell di login, bash legge ~/.bash_profile se esiste e ~/.profile , mentre zsh legge solo ~/.zprofile (perché la sua syntax non è completamente compatibile con uno sh tradizionale). Nella maggior parte delle configurazioni, ~/.profile viene caricato anche dagli script di avvio della session X quando si accede a un gestore di visualizzazione grafico.

Quando si avvia un emulatore di terminali e viene richiesto un prompt di shell o quando si inizia una shell in modo esplicito, si ottiene una shell che non è una shell di login. Poiché ~/.profile (o ~/.zprofile ) è per i comandi che si desidera eseguire quando si accede, una shell non di login non legge questo file. Invece, quando si avvia una zsh intertriggers, legge ~/.zshrc . (Zsh legge ~/.zshrc in tutte le shell interattive, siano esse le shell di login non sono; bash, stranamente, non legge mai ~/.bashrc nelle shell di login.)

In genere, ~/.profile contiene definizioni di variables di ambiente e potrebbe avviare alcuni programmi che si desidera eseguire una volta che si accede o per tutta la session; ~/.zshrc contiene le cose che devono essere fatte per each istanza di shell, ad esempio definizioni di alias e funzioni, impostazioni delle opzioni di shell, impostazioni di completamento, impostazioni dei prompt, associazioni di chiavi, ecc.

Breve risposta per le persone impazienti:

  1. ~/.profile non è caricato da zsh al login.
  2. zsh carica ~/.zprofile al login.
  3. zsh carica ~/.zshrc quando si avvia una nuova session terminal.

Hai bisogno di maggiori informazioni? Guarda la risposta superba di Gilles!

Oltre alla risposta di Gilles, con una versione ragionevolmente recente di zsh puoi farlo:

 [[ -e ~/.profile ]] && emulate sh -c 'source ~/.profile' 

… Che farà origine il file .profile con la modalità sh-zsh in vigore. Ed è attivo solo durante la fonte. Quindi non è necessario salvare lo stato dell'opzione corrente per riprodurlo di nuovo dopo il sourcing.

Ho .zprofile compatibile con .profile (contiene solo modifiche PATH), quindi solo bisogno di:

 ln -s .profile .zprofile 

La documentazione di zsh che ho a portta di mano menziona solo /etc/profile e ~/.profile per le shell di login nella modalità di compatibilità sh / ksh.

 % zsh --version zsh 4.3.10 … % cat ~/.profile echo 'Running ~/.profile...' 

La shell di login del modo nativo (argv [0] inizia con - ) non utilizza ~/.profile (utilizzerà ~/.zprofile però):

 % zsh -c 'exec -a -zsh zsh' </dev/null 

(nessuna output)

sh / ksh connessioni di login di modalità di compatibilità utilizza .profile:

 % zsh -c 'exec -a -sh zsh' </dev/null Running ~/.profile... % zsh -c 'exec -a -ksh zsh' </dev/null Running ~/.profile...