Altere $ TERMINFO no script bashrc

Altere $ TERMINFO no script bashrc

Estou tentando definir TERMINFO="$HOME/.terminfo"dentro do meu .bashrcscript. A razão é que meu terminal não está no terminfolocal do sistema e, portanto, tenho seu terminfoarquivo em meu diretório inicial.
O problema aqui é que a alteração não entra em vigor no shell atual, apenas nos subshells. Suponho que seja porque o readline está sendo inicializado antes do bash ler o .bashrcarquivo.

Então, há alguma maneira de resolver esse problema? Talvez alguma maneira de reinicializar o readline para que a alteração $TERMINFOtenha efeito?
Estou tentando evitar fazer um exec bashdepois de configurá-lo, pois então tenho que ter certeza de não acabar em um loop de reexecução, e isso é simplesmente feio (embora fazer exec bashdepois de configurá-lo funcione).

EDITAR: Isto énãoum problema ao executar o script. Eu sei com certeza que o .bashrcscript está sendo executado e isso $TERMINFOestá sendo definido. Executar echo $TERMINFOapós a inicialização do shell mostrar o valor correto.

EDIT2: Parece que isso pode estar relacionado à versão da biblioteca bash ou readline. Não consigo duplicar o problema com bash-4.2.20 e readline-6.2_p1, mas posso com bash-3.2 e readline-5.1.3.

“Não” é uma resposta aceitável se não for possível. Mas seria bom saber o que está acontecendo que faz com que a resposta seja “não”.

Responder1

Então, depois de pesquisar um pouco mais, descobri o que está acontecendo. A compilação do bash do RHEL5 não usa terminfo (por que, quem sabe, é Red Hat), ele usa termcap. No entanto, aparentemente há outro bash na caixa que usa terminfo. É por isso que subshells e reexecuções funcionariam, pois usariam o outro bash, não o padrão. Eu me sinto estúpido por não perceber isso.

Isso pode ser determinado comparando 2 comandos:

# ldd "$BASH"
    linux-vdso.so.1 =>  (0x00007fff4f1fd000)
    libtermcap.so.2 => /lib64/libtermcap.so.2 (0x0000003e0bc00000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003e07000000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003e06c00000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003e06800000)

# ldd `which bash`
    linux-vdso.so.1 =>  (0x00007fff643fd000)
    libncurses.so.5 => /usr/lib64/libncurses.so.5 (0x0000003e0d800000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003e07000000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003e06c00000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003e06800000)

Observando que um está vinculado ao libtermcap e o outro ao libncurses.

Eu deveria ter especificado que estava usando RHEL aqui, pois aparentemente esse é o fator crítico. Por que eles usam o termcap quando praticamente todo mundo o abandonou não faz sentido, mas aí está.

Responder2

De man bash- a seção de invocação:

Quando o bash é invocado como um shell de login interativo ou como um shell não interativo com a opção --login, ele primeiro lê e executa comandos do arquivo /etc/profile, se esse arquivo existir. Depois de ler esse arquivo, ele procura ~/.bash_profile, ~/.bash_login e ~/.profile, nessa ordem, e lê e executa comandos do primeiro que existe e é legível.

Para configurar seu ambiente, inclua a terminfolinha (e quaisquer outras variáveis ​​ambientais que você gostaria de definir) em .bash_profileou .profile.

Veja issoResposta do superusuário para mais detalhes.

Responder3

bash só lê .bashrcquando é iniciado.

Então você precisa source ~/.bashrcrecarregá-lo na sessão atual.

informação relacionada