Zsh não acessa ~/.profile

Zsh não acessa ~/.profile

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

.profilevs..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 ~/.profilese for chamado como shou ksh. Mas se o seu objetivo é obter um prompt zsh ao fazer login, isso não ajuda em nada.

Você pode criar /bin/shseu shell de login e incluí-lo export SHELL=/bin/zshno seu arquivo ~/.profile. Então, quando você abrir um terminal, o terminal iniciará o zsh (exceto alguns emuladores de terminal que não obedecem à $SHELLconfiguração). Mas você ainda terá shquando fizer login pelo ssh. Isso pode ser remediado incluindo exec zshno 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 sshdou su, então é seguro exec).

A solução mais fácil para trabalhar com zsh e run ~/.profileé criar um ~/.zprofileque 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'.

.zprofilevs..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 chshcomando ou através de alguma outra ferramenta como “Configurações do usuário” no Ubuntu. Quando é um shell de login, bash lê ~/.bash_profilese 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, ~/.profiletambé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ê ~/.zshrcem todos os shells interativos, sejam eles shells de login, não; bash, estranhamente, nunca lê ~/.bashrcem shells de login.)

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 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:

  1. ~/.profilenão é carregado zshno login.
  2. zshcarrega ~/.zprofileno login.
  3. zshcarrega ~/.zshrcao 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/profilee ~/.profilepara 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...

informação relacionada