Dlaczego bash prowadzi do ncurses?

11

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?

Złotowłosa
źródło
To część ncurses? Opis pakietu ( współużytkowana niskopoziomowa biblioteka terminfo do obsługi terminali ) nic nie mówi ( packages.ubuntu.com/trusty/libtinfo5 ) i wydaje się, że powłoka ma rozsądne brzmienie. Może potrzebny do wartości TERM? Ach, nieważne - widzę, że pakiet źródłowy jest ncurses.
muru
zshrównież link do libtinfo
cuonglm,

Odpowiedzi:

17

Jeśli działasz bashjako:

LD_DEBUG=bindings bash

w systemie GNU, a grep dla bash.*tinfotego wyjścia zobaczysz coś takiego:

   797:     binding file bash [0] to /lib/x86_64-linux-gnu/libtinfo.so.5 [0]: normal symbol `UP'
   797:     binding file bash [0] to /lib/x86_64-linux-gnu/libtinfo.so.5 [0]: normal symbol `PC'
   797:     binding file bash [0] to /lib/x86_64-linux-gnu/libtinfo.so.5 [0]: normal symbol `BC'
   797:     binding file bash [0] to /lib/x86_64-linux-gnu/libtinfo.so.5 [0]: normal symbol `tgetent'
   797:     binding file bash [0] to /lib/x86_64-linux-gnu/libtinfo.so.5 [0]: normal symbol `tgetstr'
   797:     binding file bash [0] to /lib/x86_64-linux-gnu/libtinfo.so.5 [0]: normal symbol `tgetflag'

Możesz potwierdzić na podstawie tego, nm -D /bin/bashże bashużywasz tych symboli z tinfo.

Doprowadzenie strony podręcznika do dowolnego z tych symboli wyjaśnia, do czego służą:

$ man tgetent
NAME
   PC, UP, BC, ospeed, tgetent, tgetflag, tgetnum, tgetstr, tgoto, tputs -
   direct curses interface to the terminfo capability database

Zasadniczo, bashbardziej prawdopodobne readlinejest , ż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ć, że readlinejest rozwijany wraz bashz tą samą osobą i jest uwzględniony w źródle bash.

Możliwe jest budowanie w bashcelu połączenia z zainstalowanym systemem libreadline, ale tylko jeśli ta wersja jest zgodna, a to nie jest domyślne. Musisz wywołać configureskrypt w czasie kompilacji za pomocą --with-installed-readline.

Stéphane Chazelas
źródło
2

bashjest aplikacją termcap za pośrednictwem readline, podobnych screeni 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 dlatgetent (o nazwie curs_termcap, ponieważ tak to zrobiono w SVr4 ...) mówi:

Procedury te są uwzględnione jako pomoc w konwersji dla programów korzystających z biblioteki termcap . Ich parametry są takie same, a procedury są emulowane przy użyciu bazy danych terminfo . Dlatego można ich używać tylko do sprawdzania możliwości wpisów, dla których skompilowano wpis terminfo .

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 bashdziała z ncurses.

Jednak biblioteka termcap jest mniejsza niż ncurses. To już miało znaczenie, a od 1997 r. Ncurses ma opcję konfiguracji, --with-termlibdzię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ż bashnie używa żadnej z funkcji curses (libncurses itp.), Rozsądne jest łączenie tylko z libtinfo.

readlinejest częścią specyficzną dla termcap bash(właściwie kiedy pierwszy raz się spotkałem bash, 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). Gdy bashjest budowany z dołączonym pakietem readline, nie zobaczysz go readlinejako oddzielnej biblioteki, ponieważ nie ma sensu, aby readlineinstalacja w pakiecie była (prawdopodobnie konfliktową) biblioteką współdzieloną. Ale (w zależności od systemu) możesz zobaczyć, libtinfoponieważ ncurses jest budowany w taki czy inny sposób (podzielony lub nie) - nie oba.

Thomas Dickey
źródło