bash: controle de ambiente dinâmico

2

Eu tenho um aplicativo que modifica variáveis de ambiente. A intenção é lançar um shell bash com um ambiente específico de contexto modificado.

Quando meu aplicativo modifica o ambiente e exec () s "bash --noprofile --norc" com o ambiente modificado, então eu quase obtenho o comportamento que quero, exceto que os aliases são descartados. Se eu fizer login e abrir um shell diretamente do sistema operacional, recebo os aliases "normais", mas se meu aplicativo iniciar um bash, não receberei nenhum alias porque os arquivos de inicialização serão ignorados.

Existe alguma maneira de ter o bash inicializado a partir de uma fonte dinâmica? Em outras palavras, seria útil se eu pudesse fazer com que meu aplicativo iniciasse "bash" com todas as suas várias configurações de usuário / instalação (incluindo aliases) e, em seguida, ao final disso, procuraria as diferenças que meu aplicativo precisa aplicar. Idealmente, isso deixaria aberto um shell preparado e pronto para ir para os meus usuários. Eu não estou achando isso (ou talvez entendendo) na página man.

Em um mundo ideal, poderíamos refatorar as configurações de usuário / fábrica para ser mais reentrante (ciente do aplicativo e ignorar as etapas de reinicialização que não precisam acontecer novamente); mas na prática isso está se tornando um pouco incômodo.

Alguma sugestão? Obrigado.

    
por Mayur Patel 18.08.2014 / 23:30

3 respostas

0
bash --noprofile --norc <<ALIAS
$(alias)
exec </dev/tty
ALIAS

Isso deve ser feito se você estiver executando o bash --noprofile... de um bash que conhece seus aliases.

Outra coisa que você poderia fazer como @WilliamEverett sugere (que, como acredito, é o melhor caminho a seguir) . Uma maneira de facilitar isso é:

alias >~/.aliasrc
{   cp ~/.bashrc ~/.bashrc.old
    grep -v '^ *alias' <~/.bashrc.old
    echo '. ~/.aliasrc'
} >~/.bashrc

Você vai querer fazer uma pequena comparação entre o arquivo rc que gera e o arquivo .old salvo se algumas definições de alias forem multi-linhas. Depois de ter classificado isso, você pode:

bash --noprofile --rcfile ~/.aliasrc
    
por 19.08.2014 / 02:35
1

Você poderia tornar seu .bashrc mais modular (por exemplo, obtendo um .aliasrc com seus aliases) e, em seguida, fazer com que seu ambiente personalizado forneça apenas os módulos especificados para esse ambiente.

    
por 19.08.2014 / 00:40
0

Você pode colocar

if [ -f ~/.Mayur_Patel_special ]
then
    . ~/.Mayur_Patel_special
    rm ~/.Mayur_Patel_special
fi

no final de seu .bashrc e, em seguida, faça com que seu aplicativo crie esse arquivo. E, obviamente, execute bash sem as opções --noprofile e --norc . Se houver várias ocorrências dessa execução simultaneamente, tornar o nome do arquivo exclusivo; por exemplo, incorporando um PID.

    
por 18.08.2014 / 23:51