Zsh não está pressionando ~ / .profile

107

Acabei de instalar o zsh no meu sistema Ubuntu. Parece que o zsh não está executando ~ / .profile no init. Para o meu melhor entendimento, esse deve ser um comportamento automático. O que estou perdendo?

    
por shmichael 12.09.2010 / 09:20

5 respostas

155

.profile vs. .zprofile

Zsh executa ~/.zprofile , não ~/.profile , quando é invocado como uma shell de login. A razão é que o zsh tem incompatibilidades suficientes com shells padrão para quebrar scripts.

O Zsh executa ~/.profile se for chamado como sh ou ksh . Mas se o seu objetivo é obter um prompt zsh quando você fizer login, isso não é uma ajuda.

Você pode fazer /bin/sh do seu shell de login e incluir export SHELL=/bin/zsh no seu ~/.profile . Então, quando você abrir um terminal, o terminal iniciará o zsh (com exceção de alguns emuladores de terminal que não obedecem à configuração $SHELL ). Mas você ainda terá sh quando fizer o login no ssh. Isso pode ser solucionado incluindo exec zsh no final de ~/.profile (isso substitui o shell em execução por zsh), mas você precisa ter cuidado apenas para fazer isso para logins interativos e não quando ~/.profile é incluído de outros scripts como o início da sessão X (um bom teste é o nome do processo pai obtido por ps -o comm= $PPID : se for sshd ou su , então é seguro usar exec ).

A solução mais fácil para trabalhar com zsh e executar ~/.profile é criar um ~/.zprofile que entra no modo de emulação sh enquanto executa ~/.profile :

emulate sh
. ~/.profile
emulate zsh

Se você tem um zsh recente o suficiente (no Ubuntu, isso significa que, como lúcido, eu acho), você pode simplificar isso para emulate sh -c '. ~/.profile' .

.zprofile vs. .zshrc

O arquivo ~/.profile é carregado por shells login . O shell de login é o primeiro processo que é iniciado quando você efetua login no modo de texto, por exemplo, em um console de texto ou via ssh. Por padrão, na maioria das máquinas Linux, o shell de login é bash, mas você pode alterá-lo com o comando chsh ou através de alguma outra ferramenta, como as “Configurações do usuário” no Ubuntu. Quando é um shell de login, o bash lê ~/.bash_profile se existir e ~/.profile , enquanto zsh lê somente ~/.zprofile (porque sua sintaxe não é completamente compatível com um sh tradicional). Na maioria das configurações, ~/.profile também é carregado pelos scripts de inicialização da sessão X quando você faz login em um gerenciador de exibição gráfico.

Quando você inicia um emulador de terminal e obtém um prompt de shell, ou quando inicia um shell explicitamente, você obtém um shell que não é um shell de login. Como ~/.profile (ou ~/.zprofile ) é para comandos que você deseja executar ao efetuar login, um shell que não seja de login não lê esse arquivo. Em vez disso, quando você inicia um zsh interativo, ele lê ~/.zshrc . (Zsh lê ~/.zshrc em todos os shells interativos, não importando se eles são shells de login; bash, estranhamente, nunca lê ~/.bashrc em shells de login.)

Normalmente, ~/.profile contém definições de variáveis de ambiente e pode iniciar alguns programas que você deseja executar uma vez ao efetuar login ou durante toda a sessão; ~/.zshrc contém coisas que devem ser feitas para cada instância do shell, como alias e definições de função, configurações de opção do shell, configurações de conclusão, configurações de prompt, atalhos de teclado, etc.

    
por 12.09.2010 / 12:37
42

Resposta curta para pessoas impacientes:

  1. ~/.profile não é carregado por zsh no login.
  2. zsh carrega ~/.zprofile no login.
  3. zsh carrega ~/.zshrc ao iniciar uma nova sessão de terminal.

Precisa de mais informações? Veja a soberba resposta de Gilles!

    
por 21.03.2015 / 14:38
16

Além da resposta de Gilles, com uma versão razoavelmente recente do zsh, você pode fazer isso:

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

... O qual irá gerar o arquivo .profile com o sh-mode do zsh em efeito. E é apenas ativo durante a fonte. Portanto, você não precisa salvar o estado da opção atual para reproduzi-lo novamente após o fornecimento.

    
por 09.03.2012 / 23:20
4

Eu tenho .zprofile compatível com .profile (contém somente alterações de PATH), portanto, precisando apenas:

ln -s .profile .zprofile
    
por 14.04.2015 / 17:30
0

A documentação zsh que tenho à mão apenas menciona /etc/profile e ~/.profile para shells de login no modo de compatibilidade sh / ksh .

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

Shell de login no modo nativo (argv [0] começa com - ) não usa ~/.profile (usará ~/.zprofile ):

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

(sem saída)

sh / ksh shell de login do modo de compatibilidade usa .profile:

% zsh -c 'exec -a -sh zsh' </dev/null
Running ~/.profile...
% zsh -c 'exec -a -ksh zsh' </dev/null
Running ~/.profile...
    
por 12.09.2010 / 11:20

Tags