Cambiar el shell predeterminado sin chsh o privilegios de administrador

8

Vi el siguiente fragmento en este hilo: Cómo cambiar de csh a bash como shell predeterminado

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

Tengo entendido que si coloca este fragmento ~/.login, se invocará bashcuando inicie sesión.

Tengo una situación similar en la que me gustaría usar un fragmento similar para invocar una versión zshdiferente de la predeterminada con la que inicio sesión. Parte de la razón por la que estoy pasando por este problema es porque no puedo elegir mi versión deseada de zshen las opciones permitidas en chsh, y no tengo privilegios de administrador.

Con este:

  • ¿Cómo cambiaría el fragmento anterior para hacer esto al cambiar entre diferentes versiones de zsh?
  • ¿Por qué se execnecesitan dos comandos en el fragmento de arriba? ¿Qué hacen? Además, ¿por qué usa el fragmento anterior sh y bash (se supone que el usuario debe iniciar sesión csh)
Amelio Vazquez-Reina
fuente

Respuestas:

6

Si desea ejecutar zsh en lugar de bash, simplemente reemplácelo /usr/local/bin/bashpor la ruta al zshejecutable. Tenga en cuenta que este fragmento es específico de csh; Si su shell de inicio de sesión no es (t) csh, este código ~/.loginno hará nada por usted.

En cuanto a por qué el fragmento se escribió de esa manera, tendría que preguntarle a la persona que lo escribió. [Comprueba quién era.] Oh. Bueno, si lo hace exec /usr/local/bin/bash, no comenzará un shell de inicio de sesión, por .profilelo que no se ejecutará. Pero esto podría resolverse de una manera más simple mediante la ejecución /usr/local/bin/bash --login.

Ahora, si su shell de inicio de sesión no es csh, querrá un fragmento diferente exec. En conchas de estilo Bourne, incluido zsh:

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

Haga eso exec ~/bin/zsh -lsi desea que la nueva instancia de zsh lea su ~/.zprofile. Tenga en cuenta que si hace eso, el fragmento de arriba debe estar en su .profileo .bash_profile; si su shell de inicio de sesión es zsh, no coloque el fragmento en su .zprofile, o asegúrese de que la nueva instancia de zsh no lo execvolverá a llamar .

Gilles 'SO- deja de ser malvado'
fuente
Gracias @Gilles. Escribí lo siguiente en mi .zprofile: ¡ if [[ $ZSH_VERSION != 4.3.14 ]]; then exec /n/sw/zsh-4.3.14/bin/zsh --login fiy eso parece funcionar!
Amelio Vazquez-Reina