Intereting Posts
Может ли доступ только к моему веб-серверу с моего компьютера? Отправка сигнала в системуd, чтобы остановить появление сообщений на консоли Может ли программа «du» быть менее агрессивной? Цвета Gnome не отображаются правильно, Vim тоже Сохранение config / pkg dirs в существующей BSD-установке для повторного использования при чистой установке и безопасные способы ее выполнения? Средство резервного копирования баз данных Mysql? Как анализировать файл, подобный этому, и определять переменные? Может ли компьютер Linux получать сканированные изображения со сканера с помощью WSD (Web Services on Devices)? Проблема с настройкой WPA2 с помощью wpa_supplicant Эмулятор терминала с функциональностью сохранения вкладок? Какие порты я должен открыть для apt-get для работы? SSH passwordless root login получает «Permission denied (publickey)». Создание shebang, указывающее переносимо интерпретатору в папке сценария Файл CSF.deny постоянно меняется? Как настроить dnsmasq на Mint-18 с помощью NetworkManager?

Почему ссылка 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 (что любопытно, на что он не ссылается). Это просто замена?

Если вы используете 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 построены так или иначе (разделены или нет) – не оба.