Estou procurando uma maneira de anular o comportamento indesejável de alguns instaladores que anexam código .bashrc
para forçar o carregamento de seu ambiente automaticamente. O problema surgiu algumas vezes, principalmente com o Conda, e em alguns casos o usuário acabou com uma conta quebrada que o impedia de fazer login mais.
Eu tentei adicionar um documento aqui não fechado no final do .bashrc, assim:
# .bashrc
#...
: <<'__END__'
O que funciona, mas gera avisos irritantes de erros de análise .
Qual seria uma maneira limpa de fazer isso (sem tornar o .bashrc somente leitura)?
Se você terminar
.bashrc
comO Bash ignorará todas as linhas adicionadas depois disso , pois
.bashrc
é tratado como um script de origem:(
exit 0
faz com que o shell saia, o que não é o que você deseja.)Embora o truque de Stephen definitivamente funcione, o problema fundamental aqui é que o instalador é executado com privilégios que permitem modificar seu arquivo
.bashrc
. Se estiver fazendo isso, pode estar fazendo todos os tipos de alterações indesejadas em outras coisas que podem causar interações interrompidas ou ser totalmente mal-intencionadas (desde spyware de telefone doméstico enviado intencionalmente a malware total de um comprometimento da cadeia de suprimentos ou ameaça interna).A solução certa é não executar "instaladores" com nenhum privilégio. Em vez disso, você pode executá-los dentro de um contêiner descartável ou conta de usuário e, em seguida, copiar apenas os arquivos desejados do ambiente "staging" para o ambiente em que deseja usá-los. Faço algo assim com uma ferramenta que escrevi, usand , que usa
unshare
para criar novos usuários e montar namespaces que bloqueiam o acesso à rede e gravam o acesso a arquivos fora do diretório atual e tudo sob ele. Embora atualmente não seja muito flexível, muitos dos mesmos conceitos podem ser aplicados para fazer algo adequado ao seu fluxo de trabalho específico.O uso
return
impede que o conteúdo extra seja executado, mas não impede que o arquivo seja preenchido com todo esse lixo ao longo do tempo. Também cria o problema em que você acidentalmente adiciona algo abaixo doreturn
e precisa descobrir por que suas alterações não estão surtindo efeito.O que eu fiz antes é adicionar uma linha no final como
# END_ACTUAL_CONTENT
. Eu criei um script que localizaria esse marcador e excluiria tudo localizado depois dele e definiria esse script para ser executado periodicamente.Você também pode usar funções como esta para neutralizar esses instaladores irritantes:
Instale seu programa com
bashrc_save; ./install.sh; bashrc_restore
e quaisquer alterações feitas em seu.bashrc
arquivo serão revertidas automaticamente.Atualmente, levo isso um passo adiante. Eu armazeno meu
.bashrc
arquivo (assim como vários outros arquivos de configuração) em um diretório separado~/.configfiles
e crio links simbólicos para os locais onde esses arquivos normalmente residem. O conteúdo dessa pasta está em um repositório git. Eu faço isso para facilitar a sincronização entre os sistemas, mas tem o benefício adicional de poder usargit diff
para ver todas as alterações feitas por um instalador egit restore
revertê-las em massa.