Como último recurso, você pode substituí-lo imediatamente com bash
. Seu .profile
poderia começar com
read -r cmd rest < <(cat /proc/$$/cmdline | tr 'if [ ! $(basename $(readlink -f $cmd)) = 'bash' ]; then
exec /bin/bash --login
fi
0' ' ')
if [ ! $(basename $(readlink -f $cmd)) = 'bash' ]; then
exec /bin/bash "$rest"
fi
#... the rest of the .profile script
Eu acredito que deveria funcionar. Teste um pouco.
EDITAR:
A versão anterior não funcionou porque $0
não é o bash que executa o script, mas normalmente o nome do script, e $@
não inclui o nome do script em execução. É por isso que a linha de comando original é obtida de proc
, para reproduzir completamente a linha de comando, mas com o primeiro argumento (o shell) substituído por bash, se ainda não é bash
(remova if
e você tem um infinito recursão).
A leitura desajeitada é feita porque proc
usa delimitadores de caracteres nulos em vez de espaços e, assim, torna nossa vida um pouco difícil. Mas não importa.
O shell pai é sobrescrito como o agente smith sobrescreve as pessoas na matriz. Não há mais dash
. O PID de dash
e tudo nele é assumido por bash
. O novo bash
executa novamente o script (mas desta vez chega ao fim).
Lembro-me de que .profile
não é passado como argumento para bash, mas executado durante a própria inicialização (originado). Você deve rever sua situação particular com cuidado. Talvez seja melhor forçar exec /bin/bash --login
a evitar problemas ao ler a linha de comando. Um shell de login deve então ler .profile
de qualquer maneira.
A proposta final é, portanto, simplesmente colocar
read -r cmd rest < <(cat /proc/$$/cmdline | tr 'if [ ! $(basename $(readlink -f $cmd)) = 'bash' ]; then
exec /bin/bash --login
fi
0' ' ')
if [ ! $(basename $(readlink -f $cmd)) = 'bash' ]; then
exec /bin/bash "$rest"
fi
#... the rest of the .profile script
no seu .profile
no começo e veja o que acontece. O ideal seria que isso não fizesse diferença se o shell de login já fosse bash, mas deveria transparentemente substituir qualquer outro shell com o bash, sem aviso prévio por parte do usuário.