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.)