Tudo bem. Eu tenho algo agora. Não é bonito, mas funciona. O principal truque é que posso fazer com que o código seja executado no shell do superusuário alterando $PROMPT_COMMAND
no ambiente. $PROMPT_COMMAND
é executado imediatamente ao alternar para o novo ambiente, e o su preserva as variáveis de ambiente bash.
Assim, aqui está a solução que estou usando:
alias su="export REAL_HOME=$HOME && export SWITCHING_TO_SU=true && export PROMPT_COMMAND='source $HOME/.bash_profile; $PROMPT_COMMAND' && su"
Agora, meu .bash_profile
será executado assim que eu alternar para o superusuário, e ele saberá duas informações importantes: 1) que está sendo executado porque estou mudando para superusuário e 2) o localização do meu diretório pessoal real. Ele pode usar essa informação para fazer qualquer outra coisa que precise fazer. Em particular, meu .bash_profile redefinirá $PROMPT_COMMAND
de volta ao seu verdadeiro valor, de modo que o script seja originado somente ao alternar para o su. No final do script, eu tenho
if [[ "$SWITCHING_TO_SU" == 'true' ]]; then
unset SWITCHING_TO_SU
unset REAL_HOME
fi
Um truque semelhante baseado no aliasing exit()
poderia ser usado, acredito, para fazer algo ao sair do superusuário.