Creo que me he dado cuenta de esto antes, pero nunca lo pensé mucho; ahora estoy curioso.
> ldd /bin/bash
linux-vdso.so.1 => (0x00007fff2f781000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f0fdd9a9000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f0fdd7a5000)
libc.so.6 => /lib64/libc.so.6 (0x00007f0fdd3e6000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0fddbf6000)
Libtinfo es parte de ncurses. Este es un sistema fedora, pero es lo mismo en ubuntu, y noto que en raspbian (una variante de debian) también se vincula a libncurses.
¿Cuál es la razón de esto? Pensé que todo lo que hizo bash podría hacerse con libreadline (que curiosamente, no se vincula a). ¿Es esto simplemente un sustituto de eso?
TERM
? Ah, no importa, veo que el paquete fuente esncurses
.zsh
también enlace a libtinfo, tambiénRespuestas:
Si corres
bash
como:en un sistema GNU, y grep
bash.*tinfo
en esa salida, verá algo como:Puede confirmar a partir de la salida
nm -D /bin/bash
quebash
está usando esos símbolos de tinfo.Al traer la página de manual de cualquiera de esos símbolos se aclara para qué sirven:
Básicamente, lo
bash
más probable es que sureadline
editor (libreadline está enlazado estáticamente) los use para consultar la base de datos terminfo para conocer las capacidades del terminal para que pueda ejecutar su editor de línea correctamente (enviando las secuencias de escape correctas e identificando las teclas presionadas correctamente) en cualquier terminal.En cuanto a por qué readline está estáticamente vinculado
bash
, debe tener en cuenta quereadline
se desarrolla juntobash
con la misma persona y se incluye en la fuente debash
.Es posible construir
bash
para vincularlo con el sistema instaladolibreadline
, pero solo si esa es de una versión compatible, y esa no es la predeterminada. Debe llamar alconfigure
script en tiempo de compilación con--with-installed-readline
.fuente
bash
es una aplicación de termcap a través dereadline
, comoscreen
y algunos otros programas. En la mayoría de los sistemas basados en Linux (aparte de Slackware), es probable que vea ncurses como la implementación subyacente de termcap .La página del manual para
tgetent
(llamado curs_termcap porque así se hizo en SVr4 ...) dice:Es decir, si el programa que realiza la llamada no examina de cerca los datos devueltos y utiliza la interfaz de termcap convencional para leer la descripción del terminal y escribir datos en la pantalla, funciona igual que el termcap original.
La mayoría de las aplicaciones de termcap no se ven tan de cerca (xterm es una excepción rara; consulte las preguntas frecuentes ) Entonces
bash
funciona con ncurses.Sin embargo, la biblioteca termcap es más pequeña que ncurses. Hace bastante tiempo, eso importaba, y desde 1997 ncurses ha tenido una opción de configuración
--with-termlib
que lo hace construir las partes específicas de termincap y terminfo como una biblioteca separada de las funciones necesarias en la biblioteca de curses de nivel superior. Pasaron algunos años y algunas de las distribuciones basadas en Linux lo incorporaron a sus paquetes.Como
bash
no usa ninguna de las funciones de maldiciones (libncurses, etc.), es razonable vincular solo contra ellibtinfo
.readline
es la parte específica de termcap debash
(en realidad, cuando me encontré por primera vezbash
, sus partes de termcap estaban codificadas , a pesar de que la fuente oficial usó termcap, tal vez para ahorrar unos pocos bytes más). Cuandobash
se compila con el paquetereadline
, no lo veráreadline
como una biblioteca separada porque no tendría sentido hacer que lareadline
instalación empaquetada sea una biblioteca compartida (posiblemente conflictiva). Pero (dependiendo de su sistema), es posible que vealibtinfo
porque ncurses se construye de una forma u otra (dividida o no), no ambas.fuente