Zsh não pressionando ~ / .profile

145

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

shmichael
fonte

Respostas:

204

.profile vs. .zprofile

O Zsh é executado ~/.zprofile, não ~/.profile, quando é chamado como um shell de login. O motivo é que o zsh possui incompatibilidades suficientes com shells padrão para interromper scripts.

O Zsh é executado ~/.profilese for chamado como shou ksh. Mas se seu objetivo é obter um prompt do zsh ao fazer login, isso não ajuda.

Você pode fazer /bin/shseu shell de login e incluir export SHELL=/bin/zshno seu ~/.profile. Então, quando você abre um terminal, o terminal inicia o zsh (exceto alguns emuladores de terminal não obedecem à $SHELLconfiguração). Mas você ainda terá shquando efetuar login no ssh. Isso pode ser remediado incluindo exec zshno final de ~/.profile(isso substitui o shell em execução pelo zsh), mas você deve ter cuidado apenas para fazer isso em logons interativos e não quando ~/.profileestiver incluído em outros scripts, como o início da sessão X (uma boa test é o nome do processo pai obtido por ps -o comm= $PPID: se for sshdor su, então é seguro exec).

A solução mais fácil para trabalhar com zsh e run ~/.profileé criar uma ~/.zprofileque entre 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 é lúcido, eu acho), você pode simplificar isso para emulate sh -c '. ~/.profile'.

.zprofile vs. .zshrc

O arquivo ~/.profileé carregado por shells de login . O shell de login é o primeiro processo 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 chshcomando 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_profilese existe e ~/.profile, enquanto o zsh lê apenas ~/.zprofile(porque sua sintaxe não é totalmente compatível com um sh tradicional). Na maioria das configurações, ~/.profiletambém é carregado pelos scripts de inicialização da sessão X quando você efetua login em um gerenciador de exibição gráfica.

Quando você inicia um emulador de terminal e obtém um prompt de shell, ou quando inicia um shell explicitamente, obtém um shell que não é um shell de logon. Como ~/.profile(ou ~/.zprofile) é para comandos que você deseja executar quando efetuar login, um shell que não é de login não lê este arquivo. Em vez disso, quando você inicia um zsh interativo, ele lê ~/.zshrc. (O Zsh lê ~/.zshrcem todos os shells interativos, sejam eles shells de logon; o bash, estranhamente, nunca lê ~/.bashrcshells de logon.)

Normalmente, ~/.profileconté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; ~/.zshrccontém coisas que devem ser feitas para cada instância do shell, como alias e definições de funções, configurações de opções de shell, configurações de conclusão, configurações de prompt, vinculação de teclas etc.

Gilles
fonte
Ótima resposta! Eu criei ~ / .zprofile e coloquei a linha como você sugeriu, mas parece não fazer nada. Talvez eu devesse colocá-lo em .zshrc?
shmichael 13/09/10
1
@shmichael: Dada a sua reação, posso não ter interpretado sua pergunta da maneira que você pretendia. A segunda seção que adicionei à minha resposta ajuda?
Gilles
sim, acerte o ponto. Portanto, se eu entendi corretamente, eu iria querer, por exemplo, declarações PATH em .zprofile e aliases em .zshrc.
shmichael
@ user1419674 Obrigado pela correção, mas não adicione um log de alterações às postagens. O site possui um histórico de revisões interno.
Gilles
69

Resposta curta para pessoas impacientes:

  1. ~/.profilenão é carregado zshno login.
  2. zshcarrega ~/.zprofileno login.
  3. zshcarrega ~/.zshrcao iniciar uma nova sessão do terminal.

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

Karl Morrison
fonte
Ótima resposta. Apenas o que você precisa.
Django Reinhardt
21

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'

... Que fornecerá o arquivo .profile com o modo sh do zsh em vigor. E só está ativo durante a fonte. Portanto, você não precisa salvar o estado atual da opção para reproduzi-lo novamente após a fonte.

Frank Terbeck
fonte
Eu tenho isso no meu ~ / .zprofile, mas por algum motivo as instruções no ~ / .profile não estão disponíveis no meu shell. Ubuntu 15.04; zsh 5.0.7
friederbluemle 15/09/2015
Difícil de diagnosticar sem código.
27416 Frank Terbeck
Acabei de tentar novamente e parece que está funcionando agora. Não tenho certeza se foi corrigido em algum momento ou o que aconteceu. A versão zsh é 5.1.1 agora.
Friededbluemle 28/03
5

Eu tenho .zprofilecompatível com .profile(contém apenas alterações PATH), portanto, apenas necessitando:

ln -s .profile .zprofile
Igor Shubovych
fonte
0

O zsh documentação eu tenho na mão apenas menciona /etc/profilee ~/.profilepara shells de login em sh / ksh modo de compatibilidade.

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

O shell de login no modo nativo (argv [0] começa com -) não usa ~/.profile(mas será usado ~/.zprofile):

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

(sem saída)

sh / ksh de compatibilidade conchas modo de login usa .profile:

% zsh -c 'exec -a -sh zsh' </dev/null
Running ~/.profile...
% zsh -c 'exec -a -ksh zsh' </dev/null
Running ~/.profile...
Chris Johnsen
fonte