Чому bash посилається на ncurses?


11

Я думаю, що я це помічав раніше, але ніколи про це не думав багато; тепер мені цікаво.

> 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 - частина ncurses. Це система Fedora, але вона однакова і в ubuntu, і я помічаю на raspbian (варіант debian), що він також посилається на libncurses.

У чому причина цього? Я подумав, що все, що робиться, може бути зроблено за допомогою вільної лінії (що цікаво, вона не посилається). Це просто заміна цьому?


Це частина ncurses? Опис пакета ( спільно з низьким рівнем Terminfo бібліотеки для термінальної обробки ) нічого (не сказати packages.ubuntu.com/trusty/libtinfo5 ), і це звучить розумно для оболонки , щоб мати. Можливо, потрібні для значень TERM? Ах, неважливо - я бачу, що вихідний пакет є ncurses.
муру

zshтакож посилання на libtinfo теж
cuonglm

Відповіді:


17

Якщо ви працюєте bashяк:

LD_DEBUG=bindings bash

в системі GNU, і виберіть bash.*tinfoцей вихід, ви побачите щось на зразок:

   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'

Ви можете підтвердити з результатів того, nm -D /bin/bashщо bashвикористовуєте ці символи з tinfo.

Передача довідкової сторінки для будь-якого з цих символів пояснює, для чого вони потрібні:

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

В основному, bashшвидше за все, його readlineредактор (libreadline є статично пов'язаним) редактором використовує ті, щоб запитувати базу даних terminfo, щоб дізнатися про можливості терміналу, щоб він міг правильно запускати редактор рядків (надсилаючи правильні послідовності виходу та правильно ідентифікуючи натискання клавіш) на будь-якому термінал.

Щодо того, чому читальна лінія статично пов'язана bash, ви повинні мати на увазі, що readlineвона розроблена разом bashз тією ж людиною і включена в джерело bash.

Можна будувати bashзв'язок із встановленою системою libreadline, але тільки якщо ця версія має сумісну версію, і це не за замовчуванням. configureСценарій потрібно викликати під час компіляції --with-installed-readline.


2

bash- додаток termcap через readline, як screenі деякі інші програми. У більшості систем на базі Linux (окрім Slackware) ви, швидше за все, будете бачити ncurses як основну реалізацію termcap .

Сторінка керівництва дляtgetent (з назвою curs_termcap, тому що це було зроблено в SVr4 ...) говорить:

Ці підпрограми включаються в якості допоміжного засобу для перетворення програм, які використовують бібліотеку termcap . Їх параметри однакові, і підпрограми імітуються за допомогою бази даних terminfo . Таким чином, їх можна використовувати лише для запиту можливостей записів, для яких складено запис terminfo .

Тобто, якщо програма, що викликає, не придивляється уважно до повернених даних, а використовує звичайний інтерфейс термінальної капи для зчитування опису терміналу та запису даних на екран, він працює так само, як оригінальний термін cap.

Більшість додатків termcap не виглядають так близько (xterm - рідкісний виняток - див. FAQ ). Так bashпрацює з ncurses.

Однак бібліотека termcap менша за ncurses. Довгий час тому це мало значення, і з 1997 року ncurses має параметр налаштування, --with-termlibзавдяки якому він створює окремі для термінаcap та terminfo частини як бібліотеку, окрему від функцій, необхідних у бібліотеці прокльонів вищого рівня. Минуло кілька років, і деякі дистрибутиви на базі Linux включили це до своїх пакетів.

Оскільки bashне використовується жодна з функцій curses (libncurses тощо), розумно зв’язувати лише проти libtinfo.

readlineє специфічною для termcap частиною bash(насправді, коли я вперше зіткнувся bash, її частини термінальної капкі були жорстко кодовані , навіть незважаючи на те, що офіційне джерело використовувало termcap - можливо, щоб зберегти ще кілька байт). Коли bashбуде побудовано з комплектацією readline, ви не будете бачити readlineокрему бібліотеку, оскільки не було б сенсу встановлювати цю пакетну readlineустановку як (можливо, суперечливу) спільну бібліотеку. Але (залежно від вашої системи) ви можете бачити, libtinfoтому що ncurses побудовано так чи інакше (розділено чи ні) - не обидва.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.