Я думаю, что заметил это раньше, но никогда не думал об этом; теперь мне любопытно
> 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, и я замечаю, что в Rasbian (вариант Debian) она также связана с самой libncurses.
В чем причина этого? Я думал, что все, что сделал bash, можно сделать с помощью libreadline (что, как ни странно, на него не ссылаются). Это просто замена для этого?
TERM
? Ах, не берите в голову - я вижу исходный пакетncurses
.zsh
также ссылка на libtinfo тожеОтветы:
Если вы запускаете
bash
как:в системе GNU и grep для
bash.*tinfo
этого вывода вы увидите что-то вроде:Вы можете подтвердить вывод
nm -D /bin/bash
,bash
используя эти символы из tinfo.Принесение справочной страницы для любого из этих символов проясняет, для чего они:
По сути,
bash
более вероятно, что егоreadline
редактор (libreadline статически связан в) использует их для запроса базы данных terminfo, чтобы узнать о возможностях терминала, чтобы он мог правильно запустить свой редактор строк (отправляя правильные escape-последовательности и правильно идентифицируя нажатия клавиш) на любом Терминал.Что касается того, почему readline статически связан
bash
, вы должны иметь в виду, чтоreadline
он разработанbash
одним и тем же человеком и включен в источникbash
.Сборку
bash
можно связать с установленной системойlibreadline
, но только если она имеет совместимую версию, и это не по умолчанию. Вам нужно вызватьconfigure
скрипт во время компиляции с--with-installed-readline
.источник
bash
является приложением termcap черезreadline
, какscreen
и некоторые другие программы. В большинстве систем на основе Linux (кроме Slackware) вы, вероятно, увидите ncurses как базовую реализацию termcap .Страница руководства для
tgetent
(названная curs_termcap, потому что так было сделано в SVr4 ...) гласит:То есть, если вызывающая программа не смотрит внимательно на возвращаемые данные и использует обычный интерфейс termcap для чтения описания терминала и записи данных на экран, она работает так же, как и исходный termcap.
Большинство приложений termcap не выглядят так пристально (xterm - редкое исключение - см. FAQ ). Так
bash
работает с курсами.Однако библиотека termcap меньше, чем ncurses. Некоторое время назад это имело значение, и с 1997 года ncurses имеет опцию конфигурации,
--with-termlib
которая позволяет создавать части, специфичные для termcap и terminfo, в виде библиотеки, отдельной от функций, необходимых в библиотеке curses более высокого уровня. Прошло несколько лет, и некоторые дистрибутивы на основе Linux включили это в свои пакеты.Поскольку
bash
не использует ни одну из функций curses (libncurses и т. Д.), Разумно ссылаться только наlibtinfo
.readline
является специфичной для termcap частьюbash
(фактически, когда я впервые столкнулсяbash
, его части termcap были жестко закодированы , хотя официальный источник использовал termcap - возможно, чтобы сохранить еще несколько байтов). Приbash
сборке из комплектаreadline
вы не увидитеreadline
отдельную библиотеку, потому что не было бы смысла делать эту комплектнуюreadline
установку в качестве (возможно, конфликтующей) разделяемой библиотеки. Но (в зависимости от вашей системы) вы можете видеть,libtinfo
потому что ncurses создается так или иначе (разделены или нет), а не оба.источник