Se você não pode executar chsh
porque você não tem privilégios de administrador, converse com alguém que tenha .
O mais provável é que você não possa usar chsh
como não-raiz porque o sistema que está usando está configurado para que chsh
não funcione, por exemplo, porque o sistema usa NIS ou LDAP em vez de apenas /etc/passwd
file. Ou talvez o administrador do seu sistema apenas queira manter algum controle.
O procedimento para alterar seu shell depende das políticas de sua organização. Pode haver um comando local que faz o que o chsh
normalmente faz. Ou você pode precisar enviar um ticket de suporte solicitando uma mudança de shell.
A maioria das outras respostas é boa, mas se seus administradores forem razoavelmente responsivos, talvez você não queira se incomodar em hackear seus scripts de inicialização. Provavelmente invoco zsh -l
manualmente depois de fazer login até que o administrador atualize minha conta.
Outra coisa a ter em mente: Às vezes, diferentes shells podem usar os mesmos arquivos de inicialização. Por exemplo, sh
e bash
podem executar $HOME/.profile
e csh
e tcsh
podem executar $HOME/.login
e $HOME/.cshrc
(embora arquivos de inicialização específicos do shell como .bashrc
, .bash_profile
e .tcshrc
pode substituir esses). Se seu shell padrão for /bin/csh
e você desejar usar /bin/tcsh
, a atualização do .login
para invocar /bin/tcsh -l
poderá criar um loop infinito. zsh
não executa arquivos de inicialização específicos de bash
, então isso não é um problema para você.
A maioria das shells definem variáveis que identificam qual shell você está executando ( $BASH_VERSION
, $tcsh
, $ZSH_VERSION
). Se você for escrever código de inicialização para invocar seu shell preferido, não é uma má idéia incluí-lo em if
, então ele é executado apenas se você ainda não estiver executando esse shell. Usando o código da resposta do konsolebox :
if [ "${ZSH_VERSION:-unset}" = "unset" ] ; then
export SHELL=/bin/zsh
exec /bin/zsh -l
fi
(A complicação adicional de verificar "${ZSH_VERSION:-unset}"
em vez de apenas "$ZSH_VERSION"
permite a possibilidade de você ter feito set -o unset
, uma opção que faz com que uma referência a uma variável indefinida seja um erro.)