Tại sao bash liên kết đến ncurses?


11

Tôi nghĩ rằng tôi đã nhận thấy điều này trước đây nhưng chưa bao giờ nghĩ về nó nhiều; Bây giờ tôi tò mò.

> 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 là một phần của ncurses. Đây là một hệ thống fedora, nhưng nó cũng giống như trên Ubuntu, và tôi nhận thấy trên raspbian (một biến thể của debian) nó cũng liên kết với libncurses.

Lý do cho điều này là gì? Tôi nghĩ rằng mọi thứ bash đã làm có thể được thực hiện với libreadline (điều tò mò là nó không liên kết đến). Đây có phải chỉ đơn giản là một thay thế cho điều đó?


Đó là một phần của ncurses? Mô tả gói ( chia sẻ ở mức độ thấp terminfo thư viện để xử lý thiết bị đầu cuối ) không nói bất cứ điều gì ( packages.ubuntu.com/trusty/libtinfo5 ), và nó có vẻ hợp lý cho một vỏ có. Có lẽ cần thiết cho các giá trị của TERM? Ah, đừng bận tâm - tôi thấy gói nguồn là ncurses.
muru

zshcũng liên kết đến libtinfo
cuonglm

Câu trả lời:


17

Nếu bạn chạy bashnhư:

LD_DEBUG=bindings bash

trên hệ thống GNU và grep cho bash.*tinfođầu ra đó, bạn sẽ thấy một cái gì đó như:

   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'

Bạn có thể xác nhận từ đầu ra của nm -D /bin/bashbashđang sử dụng những biểu tượng từ tinfo.

Mang trang người đàn ông cho bất kỳ biểu tượng nào trong số đó làm rõ những gì họ làm:

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

Về cơ bản, bashnhiều khả năng readlinetrình soạn thảo (libreadline được liên kết tĩnh), sử dụng các trình soạn thảo để truy vấn cơ sở dữ liệu terminfo để tìm hiểu về các khả năng của thiết bị đầu cuối để nó có thể chạy trình soạn thảo dòng chính xác (gửi các chuỗi thoát đúng và xác định chính xác các lần nhấn phím) thiết bị đầu cuối.

Về lý do tại sao readline được liên kết tĩnh bash, bạn phải nhớ rằng nó readlineđược phát triển cùng với bashcùng một người và được bao gồm trong nguồn của bash.

Có thể xây dựng bashđể được liên kết với hệ thống đã cài đặt libreadline, nhưng chỉ khi đó là phiên bản tương thích và đó không phải là mặc định. Bạn cần gọi configurekịch bản tại thời điểm biên dịch với --with-installed-readline.


2

bashlà một ứng dụng termcap thông qua readline, như screenvà một số chương trình khác. Trên hầu hết các hệ thống dựa trên Linux (ngoài Slackware), bạn có thể thấy các tài khoản là triển khai cơ bản của termcap .

Các trang hướng dẫn chotgetent (tên curs_termcap vì đó là cách nó đã được thực hiện trong SVR4 ...) nói:

Các thói quen này được bao gồm dưới dạng hỗ trợ chuyển đổi cho các chương trình sử dụng thư viện termcap . Các tham số của chúng là như nhau và các thường trình được mô phỏng bằng cơ sở dữ liệu terminfo . Vì vậy, chúng chỉ có thể được sử dụng để truy vấn các khả năng của các mục mà mục nhập terminfo đã được biên dịch.

Đó là, nếu chương trình gọi không nhìn kỹ vào dữ liệu được trả về và sử dụng giao diện termcap thông thường để đọc mô tả thiết bị đầu cuối và ghi dữ liệu lên màn hình, nó hoạt động giống như thuật ngữ gốc.

Hầu hết các ứng dụng termcap không nhìn kỹ như vậy (xterm là một ngoại lệ hiếm gặp - xem Câu hỏi thường gặp ). Vì vậy, bashlàm việc với ncurses.

Tuy nhiên, thư viện termcap nhỏ hơn ncurses. Cách đây khá lâu, và từ năm 1997, ncurses đã có một tùy chọn cấu hình --with-termlibđể làm cho nó xây dựng các phần cụ thể thuật ngữ và thuật ngữ như một thư viện tách biệt với các chức năng cần thiết trong thư viện nguyền rủa cấp cao hơn. Một vài năm trôi qua, và một số bản phân phối dựa trên Linux đã kết hợp nó vào các gói của họ.

bashkhông sử dụng bất kỳ chức năng nguyền rủa nào (libncurses, v.v.), nên chỉ liên kết với libtinfo.

readlinelà phần dành riêng cho termcap của bash(thực ra khi tôi gặp lần đầu bash, các phần termcap của nó đã được mã hóa cứng , mặc dù nguồn chính thức đã sử dụng termcap - có lẽ để tiết kiệm thêm vài byte). Khi bashđược xây dựng với gói readline, bạn sẽ không thấy readlinelà một thư viện riêng vì sẽ không có điểm nào trong việc tạo gói readlinecài đặt đó dưới dạng thư viện dùng chung (có thể xung đột). Nhưng (tùy thuộc vào hệ thống của bạn), bạn có thể thấy libtinfovì các ncurs được xây dựng theo cách này hay cách khác (tách hoặc không) - không phải cả hai.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.