L'administrateur système Unix où je travaille hésite à me donner accès pour changer mon shell de connexion de ksh
pour bash
. Il a donné diverses excuses, la plus drôle étant que depuis qu'ils écrivent tous leurs scripts pour ksh
ils ne fonctionneront pas si j'essaie de les exécuter. Je ne sais pas d'où il tire ces idées, mais comme je n'arrive pas à le convaincre, y a-t-il une alternative que j'ai ?
(chsh
est installé sur ces machines, mais nous utilisons des paires de clés publiques/privées pour la connexion, et je n'ai pas de mot de passe, donc quand chsh
me demande un mot de passe je n'ai rien à lui donner. )
Réponse acceptée :
Lorsque vous vous connectez, le fichier ~/.profile
est lu par le shell de connexion (ksh pour vous). Vous pouvez demander à ce shell de connexion de se remplacer par bash. Vous devez prendre quelques précautions :
- Ne remplacez le shell de connexion que s'il est interactif. Ceci est important :sinon, la connexion en mode graphique peut ne pas fonctionner (cela dépend du système :certains systèmes, mais pas tous, lisent
~/.profile
lors de la connexion via xdm ou similaire), et des idiomes tels quessh foo '. ~/.profile; mycommand'
échouera. - Vérifiez que bash est disponible, afin que vous puissiez toujours vous connecter si l'exécutable n'est pas là pour une raison quelconque.
Vous avez le choix d'exécuter bash en tant que shell de connexion ou non. La seule différence majeure pour en faire un shell de connexion est qu'il chargera ~/.bash_profile
ou ~/.profile
. Donc, si vous exécutez bash en tant que shell de connexion, faites très attention à avoir un ~/.bash_profile
ou veillez à ne pas exécuter bash de manière récursive depuis ~/.profile
. Il n'y a pas vraiment d'avantage à avoir ~/.profile
exécuté par bash plutôt que par ksh, je vous recommande donc de ne pas le faire.
Définissez également le SHELL
variable d'environnement à bash, afin que des programmes tels que des émulateurs de terminaux invoquent ce shell.
Voici le code pour passer à bash. Mettez-le à la fin de ~/.profile
.
case $- in
*i*)
# Interactive session. Try switching to bash.
if [ -z "$BASH" ]; then # do nothing if running under bash already
bash=$(command -v bash)
if [ -x "$bash" ]; then
export SHELL="$bash"
exec "$bash"
fi
fi
esac