Почему ссылка bash на ncurses?

Я думаю, что заметил это раньше, но не думал об этом; теперь мне любопытно.

> 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.

В чем причина этого? Я думал, что все, что нужно сделать, можно сделать с помощью libreadline (что любопытно, на что он не ссылается). Это просто замена?

2 Solutions collect form web for “Почему ссылка bash на ncurses?”

Если вы используете bash как:

 LD_DEBUG=bindings bash 

в системе GNU и grep для 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 для любого из этих символов разъясняет, для чего они предназначены:

 $ 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, чтобы узнать о возможностях терминала, чтобы он мог корректно запускать редактор строк (отправляя правильные 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 . Их параметры одинаковы, а подпрограммы эмулируются с использованием базы данных terminfo . Таким образом, их можно использовать только для запроса возможностей записей, для которых была скомпилирована запись terminfo .

То есть, если вызывающая программа не смотрит внимательно на возвращаемые данные и использует обычный интерфейс termcap для чтения описания терминала и записи данных на экран, он работает так же, как и исходный termcap.

Большинство приложений termcap не выглядят так близко (xterm – редкое исключение – см. FAQ ). Так bash работает с ncurses.

Однако библиотека termcap меньше, чем ncurses. Совсем недавно это имело значение, и с 1997 года у ncurses была опция configure --with-termlib которая заставляет его создавать термины termcap и terminfo как отдельную библиотеку, отличную от функций, необходимых в библиотеке curses более высокого уровня. Прошло несколько лет, и некоторые дистрибутивы на основе Linux включили их в свои пакеты.

Поскольку bash не использует ни одну из функций curses (libncurses и т. Д.), Разумно ссылаться только на libtinfo .

readline – это специфичная для termcap часть bash (на самом деле, когда я впервые столкнулся с bash , ее члены termcap были жестко закодированы , хотя официальный источник использовал termcap – возможно, чтобы сохранить еще несколько байтов). Когда bash создается с включенным readline , вы не увидите readline как отдельную библиотеку, потому что не было бы никакого смысла в том, чтобы эта readline установка readline была (возможно, конфликтующей) разделяемой библиотекой. Но (в зависимости от вашей системы) вы можете увидеть libtinfo потому что ncurses построены так или иначе (разделены или нет) – не оба.

  • Можно ли назначить несколько команд одной горячей клавише? (bash, xterm)
  • Как я могу настроить привязку пользовательских ключей даже в SSH-ed на другой компьютер?
  • Как вы настраиваете .inputrc, поэтому ALT + UP имеет эффект cd
  • Ctrl + W в vi для стирания в пробелы
  • Используя vi keybindings для readline, как мне перейти к началу строки?
  • Выделение текста в bash при использовании обратного поиска истории с помощью Ctrl-R
  • вставить текст буфера обмена плюс строку с .inputrc
  • Как отобразить управляющие символы (^ C, ^ D, ^ [, ...) по-разному в оболочке
  • Использование команды чтения оболочки с функциями редактирования в реальном времени (например, чтение)
  • Сделать zsh использовать readline вместо zle?
  • Где я могу найти список кодов терминальных клавиш для переназначения ярлыков в bash?
  • Interesting Posts

    Пакетное переименование телесериала

    Создание / удаление символической ссылки при подключении / отключении устройства USB

    Grep первые 50 строк файлов для шаблона

    Выполните проверку модуля aes-ni и aes в ядре linux

    Как я могу узнать, имеет ли ядро ​​«новый» конфиг?

    Google Chrome на Ubuntu 12.04 Замораживает мой ноутбук после 15 минут использования

    Создать торрент с файлами из разных каталогов из командной строки

    Как работает сопоставление клавиш в Linux?

    Помощь в проверке целостности файлов TAR для резервного копирования

    Какую функциональность я теряю, отключая диспетчеры дисплеев GDM / KDM / SLIM / CDM и т. Д.?

    Инструмент для переноса конфигурации службы

    Cygwin – хвост останавливает чтение входной трубы после первой записи

    Заголовок PCI в моем ноутбуке отличается от PCI-заголовка free-электронов

    Соединение VNC занимает много времени, чтобы подключиться (по существу … никогда)

    Настройка FreeBSD для получения IP-адреса с моего сервера FreeBSD DHCP

    Linux и Unix - лучшая ОС в мире.