Respostas:
.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 ~/.profile
se for chamado como sh
ou ksh
. Mas se seu objetivo é obter um prompt do zsh ao fazer login, isso não ajuda.
Você pode fazer /bin/sh
seu shell de login e incluir export SHELL=/bin/zsh
no seu ~/.profile
. Então, quando você abre um terminal, o terminal inicia o zsh (exceto alguns emuladores de terminal não obedecem à $SHELL
configuração). Mas você ainda terá sh
quando efetuar login no ssh. Isso pode ser remediado incluindo exec zsh
no 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 ~/.profile
estiver 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 sshd
or su
, então é seguro exec
).
A solução mais fácil para trabalhar com zsh e run ~/.profile
é criar uma ~/.zprofile
que 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 chsh
comando 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 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, ~/.profile
també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ê ~/.zshrc
em todos os shells interativos, sejam eles shells de logon; o bash, estranhamente, nunca lê ~/.bashrc
shells de logon.)
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ções, configurações de opções de shell, configurações de conclusão, configurações de prompt, vinculação de teclas etc.
~/.profile
não é carregado zsh
no login.zsh
carrega ~/.zprofile
no login.zsh
carrega ~/.zshrc
ao iniciar uma nova sessão do terminal.Precisa de mais informações? Veja a excelente resposta de Gilles!
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.
Eu tenho .zprofile
compatível com .profile
(contém apenas alterações PATH), portanto, apenas necessitando:
ln -s .profile .zprofile
O zsh documentação eu tenho na mão apenas menciona /etc/profile
e ~/.profile
para 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...