Cambiar $TERMINFO en el script bashrc

Cambiar $TERMINFO en el script bashrc

Estoy intentando configurarlo TERMINFO="$HOME/.terminfo"dentro de mi .bashrcscript. La razón es que mi terminal no está en la terminfoubicación del sistema, por lo que tengo su terminfoarchivo en mi directorio de inicio.
El problema aquí es que el cambio no tiene efecto para el shell actual, solo para los subshells. Supongo que es porque readline se inicializa antes de que bash lea el .bashrcarchivo.

Entonces, ¿hay alguna manera de resolver este problema? ¿Quizás alguna forma de reinicializar readline para que el cambio $TERMINFOsurta efecto?
Estoy tratando de evitar hacerlo exec bashdespués de configurarlo, ya que luego tengo que asegurarme de no terminar en un ciclo de reejecución, y eso es simplemente feo (aunque hacerlo exec bashdespués de configurarlo funciona).

EDITAR: Esto esnoun problema al ejecutar el script. Sé con certeza que el .bashrcscript se está ejecutando y que $TERMINFOse está configurando. La ejecución echo $TERMINFOdespués de que el shell haya terminado de iniciarse muestra el valor correcto.

EDITAR2: Parece que esto podría estar relacionado con la versión de la biblioteca bash o readline. No puedo duplicar el problema con bash-4.2.20 y readline-6.2_p1, pero puedo con bash-3.2 y readline-5.1.3.

"No" es una respuesta aceptable si no es posible. Pero sería bueno saber qué está pasando que hace que la respuesta sea "no".

Respuesta1

Entonces, después de investigar un poco más, descubrí lo que está pasando. La compilación de bash de RHEL5 no usa terminfo en absoluto (por qué, quién sabe, es Red Hat), usa termcap. Sin embargo, aparentemente hay otro bash en el cuadro que usa terminfo. Es por eso que los subshells y la reejecución funcionarían, ya que usarían el otro bash, no el predeterminado. Me siento estúpido por no darme cuenta de esto.

Esto se puede determinar 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)

Darse cuenta de que uno está vinculado a libtermcap y el otro a libncurses.

Debería haber especificado que estaba usando RHEL aquí, ya que aparentemente ese es el factor crítico. No tiene sentido por qué usan termcap cuando casi todos los demás en el mundo lo han abandonado, pero ahí está.

Respuesta2

Desde man bash- la sección de invocación:

Cuando se invoca bash como un shell de inicio de sesión interactivo, o como un shell no interactivo con la opción --login, primero lee y ejecuta comandos del archivo /etc/profile, si ese archivo existe. Después de leer ese archivo, busca ~/.bash_profile, ~/.bash_login y ~/.profile, en ese orden, y lee y ejecuta comandos desde el primero que existe y es legible.

Para configurar su entorno, incluya la terminfolínea (y cualquier otra variable ambiental que desee configurar) en .bash_profileo .profile.

Mira estoRespuesta de superusuario para más detalles..

Respuesta3

bash solo lee .bashrccuando comienza.

Por lo tanto, debe source ~/.bashrcvolver a cargarlo en la sesión actual.

información relacionada