Risposte:
.profile vs. .zprofileZsh 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 ~/.profilese viene chiamato come sho ksh. Ma se il tuo obiettivo è ottenere un prompt zsh quando accedi, non è di aiuto.
Puoi creare la /bin/shtua shell di accesso e includerla export SHELL=/bin/zshnel tuo ~/.profile. Quindi quando aprite un terminale, il terminale avvierà zsh (tranne che per alcuni emulatori di terminale non obbediscono $SHELLall'impostazione). Ma avrai ancora shquando accedi su ssh. Questo può essere risolto includendo exec zshalla 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 è sshdo su, allora è sicuro exec).
La soluzione più semplice sia per lavorare con zsh che run ~/.profileè quella di creare un ~/.zprofileche 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. .zshrcIl file ~/.profileviene 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 chshcomando o tramite altri strumenti come "Impostazioni utente" in Ubuntu. Quando è una shell di login, bash legge ~/.bash_profilese esiste e ~/.profile, mentre zsh legge solo ~/.zprofile(perché la sua sintassi non è completamente compatibile con uno sh tradizionale). Nella maggior parte delle configurazioni, ~/.profileviene 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 ~/.zshrcin tutte le shell interattive, indipendentemente dal fatto che siano shell di login, bash, stranamente, non legge mai ~/.bashrcnelle shell di login).
In genere, ~/.profilecontiene definizioni di variabili di ambiente e potrebbe avviare alcuni programmi che si desidera eseguire una volta quando si accede o per l'intera sessione; ~/.zshrccontiene 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.
~/.profilenon viene caricato zshall'accesso.zshcarica ~/.zprofileall'accesso.zshsi carica ~/.zshrcall'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 .zprofilecompatibile 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/profilee ~/.profileper 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à ~/.zprofilecomunque):
% 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...