
Acabei de instalar o zsh no meu sistema Ubuntu. Parece que o zsh não está executando ~/.profile no init. No meu melhor entendimento, esse deve ser um comportamento automático. o que estou perdendo?
Responder1
.profile
vs..zprofile
Zsh é executado ~/.zprofile
, não ~/.profile
, quando é invocado como um shell de login. A razão é que o zsh tem incompatibilidades suficientes com shells padrão para quebrar scripts.
Zsh é executado ~/.profile
se for chamado como sh
ou ksh
. Mas se o seu objetivo é obter um prompt zsh ao fazer login, isso não ajuda em nada.
Você pode criar /bin/sh
seu shell de login e incluí-lo export SHELL=/bin/zsh
no seu arquivo ~/.profile
. Então, quando você abrir um terminal, o terminal iniciará o zsh (exceto alguns emuladores de terminal que não obedecem à $SHELL
configuração). Mas você ainda terá sh
quando fizer login pelo ssh. Isso pode ser remediado 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 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
ou su
, então é seguro exec
).
A solução mais fácil para trabalhar com zsh e run ~/.profile
é criar um ~/.zprofile
que entre no modo de emulação sh enquanto é executado ~/.profile
:
emulate sh
. ~/.profile
emulate zsh
Se você tiver 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 porConecte-secartuchos. O shell de login é o primeiro processo iniciado quando você faz login em modo 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 “Configurações do usuário” no Ubuntu. Quando é um shell de login, bash lê ~/.bash_profile
se existe e ~/.profile
, enquanto 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ê faz 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 login. Como ~/.profile
(ou ~/.zprofile
) é para comandos que você deseja executar ao efetuar login, um shell sem 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, sejam eles shells de login, não; 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 definições de alias e funções, configurações de opções do shell, configurações de conclusão, configurações de prompt, combinações de teclas, etc.
Responder2
Resposta curta para pessoas impacientes:
~/.profile
não é carregadozsh
no login.zsh
carrega~/.zprofile
no login.zsh
carrega~/.zshrc
ao iniciar uma nova sessão de terminal.
Precisa de mais informações? Veja a excelente resposta de Gilles!
Responder3
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 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 da opção atual para reproduzi-la novamente após a fonte.
Responder4
Ozshdocumentação que tenho em mãos apenas menciona /etc/profile
e ~/.profile
para shells de login emeh/kshmodo 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 usará ~/.zprofile
):
% zsh -c 'exec -a -zsh zsh' </dev/null
(sem saída)
eh/kshOs shells de login do modo de compatibilidade usam .profile:
% zsh -c 'exec -a -sh zsh' </dev/null
Running ~/.profile...
% zsh -c 'exec -a -ksh zsh' </dev/null
Running ~/.profile...