Alterando o shell padrão sem chsh ou privilégios de administrador

8

Eu vi o seguinte trecho neste tópico: Como mudar de csh para bash como shell padrão

sleep 2
if (-x /usr/local/bin/bash) then
  exec /bin/sh -c '. ~/.profile; exec /usr/local/bin/bash'
endif

Meu entendimento é que, se você colocar esse trecho, ~/.loginele será chamado bashquando você fizer login.

Tenho uma situação semelhante em que gostaria de usar um trecho semelhante para invocar uma versão zshdiferente da padrão com a qual efetuo login. Parte do motivo pelo qual estou passando por esse problema é porque não posso escolher minha versão desejada de zshnas opções permitidas chshe não tenho privilégios de administrador.

Com isso:

  • Como eu alteraria o trecho acima para fazer isso ao alternar entre diferentes versões do zsh?
  • Por que dois execcomandos são necessários no snippet acima? O que eles fazem? Além disso, por que o snippet acima é usado sh e bash (o usuário deve fazer login csh)
Amelio Vazquez-Reina
fonte

Respostas:

6

Se você deseja executar o zsh em vez do bash, substitua /usr/local/bin/bashpelo caminho do zshexecutável. Observe que esse trecho é específico ao csh; se o seu shell de login não for (t) csh, esse código ~/.loginnão fará nada por você.

Quanto ao motivo pelo qual o trecho foi escrito dessa maneira, você teria que perguntar à pessoa que o escreveu. [Verifica quem era.] Oh. Bem, se você fizer exec /usr/local/bin/bashisso, não iniciará um shell de login, portanto .profilenão será executado. Mas isso poderia ser resolvido de uma maneira mais simples, executando /usr/local/bin/bash --login.

Agora, se o seu shell de login não for csh, você desejará um trecho diferente exec. Em conchas no estilo Bourne, incluindo zsh:

if [ -x ~/bin/zsh ]; then exec ~/bin/zsh; fi

Faça isso exec ~/bin/zsh -lse quiser que a nova instância do zsh leia o seu ~/.zprofile. Observe que, se você fizer isso, o snippet acima deverá estar no seu .profileou .bash_profile; se o seu shell de login for zsh, não coloque o trecho no seu .zprofile, ou verifique se a nova instância do zsh não chamará isso de execnovo.

Gilles 'SO- parar de ser mau'
fonte
Obrigado @Gilles. Eu escrevi o seguinte no meu .zprofile: if [[ $ZSH_VERSION != 4.3.14 ]]; then exec /n/sw/zsh-4.3.14/bin/zsh --login fie isso parece funcionar!
Amelio Vazquez-Reina