Bash

為什麼 bash 連結到 ncurses?

  • July 12, 2016

我想我之前已經註意到了這一點,但從來沒有考慮過。現在我很好奇。

> 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 本身。

這是什麼原因?我認為 bash 所做的一切都可以用 libreadline 完成(奇怪的是,它沒有連結到)。這僅僅是一個替代品嗎?

如果你執行bash為:

LD_DEBUG=bindings bash

在 GNU 系統上,並在該輸出中使用 grep for 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使用bashtinfo 中的那些符號。

為這些符號中的任何一個帶來手冊頁可以闡明它們的用途:

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

基本上,它的(libreadline 是靜態連結的)編輯器bash更有可能使用這些來查詢 terminfo 數據庫以了解終端功能,以便它可以在任何readline終端。

至於為什麼readline是靜態連結進去bash的,你要記住的readline是,它是由同一個人一起開發bash的,並且包含在原始碼中bash

可以建構bash以與系統的 installed 連結libreadline,但前提是該版本具有兼容版本,並且這不是預設設置。您需要configure在編譯時使用--with-installed-readline.

引用自:https://unix.stackexchange.com/questions/230119