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.