Altere $ TERMINFO no script bashrc

6

Estou tentando definir TERMINFO="$HOME/.terminfo" no meu script .bashrc . O motivo é que meu terminal não está no sistema terminfo location e, portanto, eu tenho seu arquivo terminfo em meu diretório home.
O problema aqui é que a mudança não entra em vigor para o shell atual, apenas para subshells. Eu estou supondo que é porque o readline está sendo inicializado antes do bash ler o arquivo .bashrc .

Existe alguma maneira de resolver esse problema? Talvez alguma maneira de reinicializar readline para que o $TERMINFO alterado entre em vigor?
Eu estou tentando evitar fazer um exec bash depois de configurá-lo, como então eu tenho que ter certeza que eu não acabe em um loop re-exec, e isso é apenas feio (embora fazendo exec bash após a configuração funciona ).

EDIT: Isso não é um problema executando o script. Eu sei de fato que o script .bashrc está sendo executado e que $TERMINFO está sendo definido. A execução de echo $TERMINFO após o término da inicialização do shell mostra o valor correto.

EDIT2: Parece que esta pode ser uma versão da biblioteca bash ou readline relacionada. Eu não posso 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".

    
por Patrick 11.04.2012 / 04:21

3 respostas

4

Então, depois de procurar mais, descobri o que está acontecendo. A compilação do bash do RHEL5 não usa o terminfo (porque, quem sabe, é o Red Hat), ele usa o termcap. No entanto, há aparentemente outra festa na caixa que usa terminfo. É por isso que os subshells e re-execings funcionariam, pois usariam o outro bash, não o padrão. Eu me sinto idiota por não perceber isso.

Isso pode ser determinado pela comparação de dois 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)

Notando que um está ligado ao libtermcap e o outro ao libncurses.

Eu deveria ter especificado que eu estava usando o RHEL aqui, já que esse é aparentemente o fator crítico. Por que eles usam termcap quando praticamente todos os outros no mundo abandonaram, não faz sentido, mas aí está.

    
por 13.04.2012 / 15:23
0

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

When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable.

Para configurar seu ambiente, inclua a linha terminfo (e quaisquer outras variáveis de ambiente que você gostaria de definir) em .bash_profile ou .profile .

Veja esta Resposta do superusuário para mais detalhes .

    
por 11.04.2012 / 04:55
0

o bash só lê .bashrc quando é iniciado.

Então, você precisa fazer source ~/.bashrc para recarregá-lo na sessão atual.

    
por 11.04.2012 / 05:08