Risposte:
.profile
vs. .zprofile
Zsh viene eseguito ~/.zprofile
, non ~/.profile
, quando viene invocato come shell di login. Il motivo è che zsh ha abbastanza incompatibilità con le shell standard per interrompere gli script.
Zsh viene eseguito ~/.profile
se viene chiamato come sh
o ksh
. Ma se il tuo obiettivo è ottenere un prompt zsh quando accedi, non è di aiuto.
Puoi creare la /bin/sh
tua shell di accesso e includerla export SHELL=/bin/zsh
nel tuo ~/.profile
. Quindi quando aprite un terminale, il terminale avvierà zsh (tranne che per alcuni emulatori di terminale non obbediscono $SHELL
all'impostazione). Ma avrai ancora sh
quando accedi su ssh. Questo può essere risolto includendo exec zsh
alla fine di ~/.profile
(questo sostituisce la shell in esecuzione con zsh), ma devi fare attenzione solo a farlo per gli accessi interattivi e non quando ~/.profile
è incluso da altri script come l'inizio della sessione X (un buon test è il nome del processo genitore ottenuto da ps -o comm= $PPID
: se è sshd
o su
, allora è sicuro exec
).
La soluzione più semplice sia per lavorare con zsh che run ~/.profile
è quella di creare un ~/.zprofile
che entri in modalità di emulazione sh mentre è in esecuzione ~/.profile
:
emulate sh
. ~/.profile
emulate zsh
Se hai un zsh abbastanza recente (su Ubuntu, ciò significa che da lucido, credo), puoi semplificarlo emulate sh -c '. ~/.profile'
.
.zprofile
vs. .zshrc
Il file ~/.profile
viene caricato da shell di login . La shell di accesso è il primo processo che viene avviato quando si accede in modalità testo, ad esempio su una console di testo o tramite ssh. Per impostazione predefinita, sulla maggior parte delle macchine Linux, la shell di accesso è bash, ma è possibile modificarla con il chsh
comando o tramite altri strumenti come "Impostazioni utente" in Ubuntu. Quando è una shell di login, bash legge ~/.bash_profile
se esiste e ~/.profile
, mentre zsh legge solo ~/.zprofile
(perché la sua sintassi non è completamente compatibile con uno sh tradizionale). Nella maggior parte delle configurazioni, ~/.profile
viene anche caricato dagli script di avvio della sessione X quando si accede a un display manager grafico.
Quando si avvia un emulatore di terminale e si riceve un prompt della shell o quando si avvia esplicitamente una shell, si ottiene una shell che non è una shell di accesso. Poiché ~/.profile
(o ~/.zprofile
) è per i comandi che si desidera eseguire quando si accede, una shell non di accesso non legge questo file. Invece, quando si avvia uno zsh interattivo, si legge ~/.zshrc
. (Zsh legge ~/.zshrc
in tutte le shell interattive, indipendentemente dal fatto che siano shell di login, bash, stranamente, non legge mai ~/.bashrc
nelle shell di login).
In genere, ~/.profile
contiene definizioni di variabili di ambiente e potrebbe avviare alcuni programmi che si desidera eseguire una volta quando si accede o per l'intera sessione; ~/.zshrc
contiene cose che devono essere fatte per ogni istanza della shell, come alias e definizioni delle funzioni, impostazioni delle opzioni della shell, impostazioni di completamento, impostazioni di prompt, associazioni di tasti, ecc.
~/.profile
non viene caricato zsh
all'accesso.zsh
carica ~/.zprofile
all'accesso.zsh
si carica ~/.zshrc
all'avvio di una nuova sessione terminale.Hai bisogno di maggiori informazioni? Guarda la superba risposta di Gilles!
Oltre alla risposta di Gilles, con una versione ragionevolmente recente di zsh puoi farlo:
[[ -e ~/.profile ]] && emulate sh -c 'source ~/.profile'
... Che genererà il file .profile con la modalità sh di zsh attiva. Ed è attivo solo durante la fonte. Quindi non è necessario salvare lo stato dell'opzione corrente per poterlo riprodurre nuovamente dopo l'approvvigionamento.
Ho .zprofile
compatibile con .profile
(contiene solo modifiche PATH), quindi ho solo bisogno di:
ln -s .profile .zprofile
La zsh documentazione che ho a portata di mano parla solo /etc/profile
e ~/.profile
per le shell di login a sh / ksh modalità di compatibilità.
% zsh --version
zsh 4.3.10 …
% cat ~/.profile
echo 'Running ~/.profile...'
La shell di login in modalità nativa (argv [0] inizia con -
) non usa ~/.profile
(userà ~/.zprofile
comunque):
% zsh -c 'exec -a -zsh zsh' </dev/null
(nessuna uscita)
sh / ksh di compatibilità conchiglie modalità di accesso utilizza .profile:
% zsh -c 'exec -a -sh zsh' </dev/null
Running ~/.profile...
% zsh -c 'exec -a -ksh zsh' </dev/null
Running ~/.profile...