Estou tentando definir TERMINFO="$HOME/.terminfo"
dentro do meu .bashrc
script. A razão é que meu terminal não está no terminfo
local do sistema e, portanto, tenho seu terminfo
arquivo 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 .bashrc
arquivo.
Então, há alguma maneira de resolver esse problema? Talvez alguma maneira de reinicializar o readline para que a alteração $TERMINFO
tenha efeito?
Estou tentando evitar fazer um exec bash
depois 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 bash
depois de configurá-lo funcione).
EDITAR: Isto énãoum problema ao executar o script. Eu sei com certeza que o .bashrc
script está sendo executado e isso $TERMINFO
está sendo definido. Executar echo $TERMINFO
apó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 terminfo
linha (e quaisquer outras variáveis ambientais que você gostaria de definir) em .bash_profile
ou .profile
.
Responder3
bash só lê .bashrc
quando é iniciado.
Então você precisa source ~/.bashrc
recarregá-lo na sessão atual.