Estoy intentando configurarlo TERMINFO="$HOME/.terminfo"
dentro de mi .bashrc
script. La razón es que mi terminal no está en la terminfo
ubicación del sistema, por lo que tengo su terminfo
archivo 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 .bashrc
archivo.
Entonces, ¿hay alguna manera de resolver este problema? ¿Quizás alguna forma de reinicializar readline para que el cambio $TERMINFO
surta efecto?
Estoy tratando de evitar hacerlo exec bash
despué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 bash
después de configurarlo funciona).
EDITAR: Esto esnoun problema al ejecutar el script. Sé con certeza que el .bashrc
script se está ejecutando y que $TERMINFO
se está configurando. La ejecución echo $TERMINFO
despué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 terminfo
línea (y cualquier otra variable ambiental que desee configurar) en .bash_profile
o .profile
.
Respuesta3
bash solo lee .bashrc
cuando comienza.
Por lo tanto, debe source ~/.bashrc
volver a cargarlo en la sesión actual.