Myślę, że już to zauważyłem, ale nigdy o tym nie myślałem; teraz jestem ciekawa.
> 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 jest częścią ncurses. Jest to system fedora, ale jest taki sam na Ubuntu, i zauważam, że na raspbian (wariant debian) również łączy się z samą libncurses.
Jaki jest tego powód? Myślałem, że wszystko, co zrobił bash, można zrobić za pomocą libreadline (który, co ciekawe, nie prowadzi do linku). Czy to po prostu namiastka?
TERM
? Ach, nieważne - widzę, że pakiet źródłowy jestncurses
.zsh
również link do libtinfoOdpowiedzi:
Jeśli działasz
bash
jako:w systemie GNU, a grep dla
bash.*tinfo
tego wyjścia zobaczysz coś takiego:Możesz potwierdzić na podstawie tego,
nm -D /bin/bash
żebash
używasz tych symboli z tinfo.Doprowadzenie strony podręcznika do dowolnego z tych symboli wyjaśnia, do czego służą:
Zasadniczo,
bash
bardziej prawdopodobnereadline
jest , że jego edytor (libreadline jest statycznie połączony) korzysta z tych zapytań do bazy danych terminfo w celu uzyskania informacji o możliwościach terminala, aby mógł poprawnie uruchomić swój edytor linii (wysyłając prawidłowe sekwencje specjalne i poprawnie identyfikując naciśnięcia klawiszy) na dowolnym terminal.Jeśli chodzi o to, dlaczego readline jest statycznie powiązany
bash
, musisz pamiętać, żereadline
jest rozwijany wrazbash
z tą samą osobą i jest uwzględniony w źródlebash
.Możliwe jest budowanie w
bash
celu połączenia z zainstalowanym systememlibreadline
, ale tylko jeśli ta wersja jest zgodna, a to nie jest domyślne. Musisz wywołaćconfigure
skrypt w czasie kompilacji za pomocą--with-installed-readline
.źródło
bash
jest aplikacją termcap za pośrednictwemreadline
, podobnychscreen
i niektórych innych programów. W większości systemów opartych na Linuksie (oprócz Slackware) prawdopodobnie zobaczysz ncurses jako podstawową implementację termcap .Strona podręcznika dla
tgetent
(o nazwie curs_termcap, ponieważ tak to zrobiono w SVr4 ...) mówi:Oznacza to, że jeśli program wywołujący nie przyjrzy się uważnie zwróconym danym i używa konwencjonalnego interfejsu termcap do odczytu opisu terminala i zapisywania danych na ekranie, działa on tak jak oryginalny termcap.
Większość aplikacji termcap nie wygląda tak dokładnie (xterm to rzadki wyjątek - patrz FAQ ). Więc
bash
działa z ncurses.Jednak biblioteka termcap jest mniejsza niż ncurses. To już miało znaczenie, a od 1997 r. Ncurses ma opcję konfiguracji,
--with-termlib
dzięki której buduje części specyficzne dla termincap i terminfo jako bibliotekę oddzieloną od funkcji potrzebnych w bibliotece curses wyższego poziomu. Minęło kilka lat, a niektóre dystrybucje oparte na systemie Linux włączyły to do swoich pakietów.Ponieważ
bash
nie używa żadnej z funkcji curses (libncurses itp.), Rozsądne jest łączenie tylko zlibtinfo
.readline
jest częścią specyficzną dla termcapbash
(właściwie kiedy pierwszy raz się spotkałembash
, jego części zostały zakodowane na stałe , nawet jeśli oficjalne źródło używało termcap - być może w celu zaoszczędzenia kilku dodatkowych bajtów). Gdybash
jest budowany z dołączonym pakietemreadline
, nie zobaczysz goreadline
jako oddzielnej biblioteki, ponieważ nie ma sensu, abyreadline
instalacja w pakiecie była (prawdopodobnie konfliktową) biblioteką współdzieloną. Ale (w zależności od systemu) możesz zobaczyć,libtinfo
ponieważ ncurses jest budowany w taki czy inny sposób (podzielony lub nie) - nie oba.źródło