Questão Zsh não acertando ~ / .profile


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?


106


origem




Respostas:


.profile vs. .zprofile

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

Zsh corre ~/.profile se é chamado como sh ou ksh. Mas se o seu objetivo é obter um prompt zsh quando você entrar, isso não é de ajuda.

Você pode fazer /bin/sh seu shell de login e incluir export SHELL=/bin/zsh na tua ~/.profile. Então, quando você abre um terminal, o terminal vai lançar o zsh (exceto por alguns emuladores de terminal não obedecerem ao $SHELL configuração). Mas você ainda terá sh quando você faz o login no ssh. Isso pode ser remediado incluindo exec zsh no fim 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 está incluído em 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 é sshd ou suentão é seguro exec).

A solução mais fácil para ambos, trabalhar com zsh e executar ~/.profile é criar um ~/.zprofile que entra no modo de emulação sh enquanto é executado ~/.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 entrar cartuchos. 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 chsh comando, ou através de alguma outra ferramenta como o “User Settings” no Ubuntu. Quando é um shell de login, o bash lê ~/.bash_profile se existir e ~/.profile, enquanto o 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ê efetua 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. Desde a ~/.profile (ou ~/.zprofile) é para comandos que você deseja executar ao efetuar login, um shell que não seja de login não lê este arquivo. Em vez disso, quando você inicia um zsh interativo, ele lê ~/.zshrc. (Zsh lê ~/.zshrc em todos os shells interativos, se eles são shells de login não são; bash, estranhamente, nunca lê ~/.bashrc em shells de login.)

Tipicamente, ~/.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.


152



Ótima resposta! Eu criei ~ / .zprofile e coloquei a linha como você sugeriu, mas não parece fazer nada. Talvez eu devesse colocá-lo em .zshrc? - shmichael
@shmichael: Dada a sua reação, eu posso não ter interpretado sua pergunta do jeito que você pretendia. A segunda seção que adicionei à minha resposta ajuda? - Gilles
sim, acerte o local. Então, se eu entendi corretamente, eu gostaria, por exemplo Declarações de PATH em .zprofile e aliases em .zshrc. - shmichael
@ user1419674 Obrigado pela correção, mas não adiciona um log de alterações às mensagens. O site tem um histórico de revisão embutido. - Gilles


Resposta curta para pessoas impacientes:

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

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


40



+2 para uma resposta rápida e digitalizável - dreftymac


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 irá fornecer 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.


16



Eu tenho isso no meu ~ / .zprofile, mas por algum motivo as declarações em ~ / .profile não estão disponíveis no meu shell. Ubuntu 15.04; zsh 5.0.7 - friederbluemle
Difícil de diagnosticar sem código. - Frank Terbeck
Eu apenas tentei de novo, e parece que está funcionando agora. Não tenho certeza se foi corrigido em algum momento ou o que aconteceu. A versão do zsh é 5.1.1 agora. - friederbluemle


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

ln -s .profile .zprofile

4





o zsh documentação que tenho à 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...'

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

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

(sem saída)

sh/ksh as conchas 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...

0