Zsh non colpisce ~ / .profile


145

Ho appena installato zsh sul mio sistema Ubuntu. Sembra che zsh non stia eseguendo ~ / .profile su init. Per quanto ne so, questo dovrebbe essere un comportamento automatico. Cosa mi sto perdendo?

Risposte:


204

.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 ~/.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. .zshrc

Il 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.


Bella risposta! Ho creato ~ / .zprofile e messo la linea come da te suggerito, ma non sembra fare nulla. Forse dovrei metterlo in .zshrc?
shmichael,

1
@shmichael: Data la tua reazione, potrei non aver interpretato la tua domanda nel modo in cui la intendevi. La seconda sezione che ho aggiunto alla mia risposta aiuta?
Gilles,

si, colpisci il posto. Quindi, se capisco correttamente, vorrei ad esempio le dichiarazioni PATH su .zprofile e gli alias su .zshrc.
shmichael,

@ user1419674 Grazie per la correzione, ma non aggiungere un registro delle modifiche ai post. Il sito ha una cronologia delle revisioni integrata.
Gilles,

69

Risposta breve per persone impazienti:

  1. ~/.profilenon viene caricato zshall'accesso.
  2. zshcarica ~/.zprofileall'accesso.
  3. zshsi carica ~/.zshrcall'avvio di una nuova sessione terminale.

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


Bella risposta. Proprio quello che ti serve.
Django Reinhardt,

21

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 questo nel mio ~ / .zprofile, ma per qualche ragione le dichiarazioni in ~ / .profile non sono disponibili nella mia shell. Ubuntu 15.04; zsh 5.0.7
friederbluemle,

Difficile da diagnosticare senza codice.
Frank Terbeck,

Ho appena provato di nuovo e sembra che funzioni ora. Non sono sicuro se è stato risolto ad un certo punto o cosa è successo. La versione zsh è 5.1.1 ora.
friederbluemle,

5

Ho .zprofilecompatibile con .profile(contiene solo modifiche PATH), quindi ho solo bisogno di:

ln -s .profile .zprofile

0

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...
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.