L'amministratore di sistema unix su cui sto lavorando è riluttante a concedermi l'accesso per modificare la mia shell di accesso da ksh
per bash
. Ha fornito varie scuse, la più divertente è che dal momento che scrivono tutti i loro script per ksh
non funzioneranno se provo a eseguirli. Non so dove abbia preso queste idee, ma siccome non riesco a convincerlo, c'è qualche alternativa che ho?
(chsh
è installato su queste macchine, ma utilizziamo coppie di chiavi pubbliche/private per l'accesso e non ho alcuna password, quindi quando chsh
mi chiede una password non ho niente da darle. )
Risposta accettata:
Quando accedi, il file ~/.profile
viene letto dalla shell di login (ksh per te). Puoi indicare a quella shell di accesso di sostituirsi con bash. Dovresti prendere alcune precauzioni:
- Sostituisci la shell di accesso solo se è interattiva. Questo è importante:altrimenti, l'accesso in modalità grafica potrebbe non funzionare (questo dipende dal sistema:alcuni ma non tutti i sistemi leggono
~/.profile
quando si accede tramite xdm o simili) e idiomi comessh foo '. ~/.profile; mycommand'
fallirà. - Verifica che bash sia disponibile, in modo da poter comunque accedere se l'eseguibile non è presente per qualche motivo.
Puoi scegliere se eseguire bash come shell di accesso o meno. L'unica grande differenza nel renderlo una shell di accesso è che caricherà ~/.bash_profile
o ~/.profile
. Quindi, se esegui bash come shell di accesso, fai molta attenzione ad avere un ~/.bash_profile
o fai attenzione a non eseguire bash in modo ricorsivo da ~/.profile
. Non c'è alcun vantaggio reale nell'avere ~/.profile
eseguito da bash anziché da ksh, quindi consiglierei di non farlo.
Imposta anche il SHELL
variabile di ambiente su bash, in modo che programmi come emulatori di terminale invochino quella shell.
Ecco il codice per passare a bash. Mettilo alla fine di ~/.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