Bash
為什麼 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 本身。
這是什麼原因?我認為 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
使用bash
tinfo 中的那些符號。為這些符號中的任何一個帶來手冊頁可以闡明它們的用途:
$ 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
.