나는 이것을 이전에 알아차린 것 같지만 실제로 생각해본 적이 없습니다. 지금은 궁금합니다.
> 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 시스템이지만 우분투에서도 동일합니다. raspbian(데비안 변형)에서는 libncurses 자체에도 연결된다는 것을 알았습니다.
그 이유는 무엇입니까? 나는 bash가 하는 모든 일이 libreadline(이상하게도 연결되어 있지 않음)으로 수행될 수 있다고 생각합니다. 이게 그냥 대체품인가요?
답변1
다음과 같이 실행하는 경우 bash
:
LD_DEBUG=bindings bash
GNU 시스템과 bash.*tinfo
grep for 출력에서 다음과 유사한 내용을 볼 수 있습니다.
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'
tinfo의 이러한 기호가 사용되고 nm -D /bin/bash
있음 을 출력에서 확인할 수 있습니다 .bash
이러한 기호를 제공하는 매뉴얼 페이지에서는 해당 기호의 목적을 명확히 할 수 있습니다.
$ 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 데이터베이스를 쿼리하여 라인 편집기를 모든 장치에서 올바르게 실행할 수 있습니다(올바른 이스케이프 시퀀스를 보내고 키를 올바르게 식별합니다). 단말기.
readline이 왜 에 정적으로 연결되어 있는지에 대해서는 같은 사람들이 함께 개발했으며 에 포함되어 있다는 bash
것을 기억해야 합니다 .readline
bash
bash
bash
시스템에 설치된 버전에 대한 링크를 구축하는 것이 가능 libreadline
하지만 버전이 호환되는 버전이고 이것이 기본값이 아닌 경우에만 가능합니다. configure
컴파일 타임에 사용해야 합니다 --with-installed-readline
.
답변2
bash
는용어 모자애플리케이션readline
, 좋아요 screen
및 기타 프로그램을 통해 . 대부분의 Linux 기반 시스템(Slackware 제외)에서는 아마도 ncurses를 기본 구현으로 생각할 것입니다.용어 모자.
이것매뉴얼 페이지tgetent
(명명 된curs_termcap그것이 SVr4에서 수행되는 방식이기 때문에...)는 다음과 같이 말했습니다:
이러한 루틴은 다음을 사용하는 프로그램의 변환 보조 도구로 포함됩니다.용어 모자도서관. 해당 매개변수는 동일하며 루틴은 다음을 사용하여 시뮬레이션됩니다.용어 정보 데이터 베이스. 따라서 항목의 기능을 쿼리하는 데에만 사용할 수 있습니다.용어 정보항목이 컴파일되었습니다.
즉, 호출 프로그램이 반환된 데이터를 자세히 살펴보지 않고 대신 전통적인 termcap 인터페이스를 사용하여 터미널 설명을 읽고 데이터를 화면에 쓰는 경우 원시 termcap처럼 작동합니다.
대부분의 termcap 응용 프로그램은 그다지 조심스러워 보이지 않습니다(xterm은 드문 예외입니다.FAQ 보기). 따라서 bash
ncurses와 함께 사용할 수 있습니다.
그러나 termcap 라이브러리는 ncurses보다 작습니다. 이것은 오래 전부터 중요했고,1997년부터--with-termlib
ncurses 에는 상위 수준의 curs 라이브러리에 필요한 기능과 별도로 termcap 및 terminfo 특정 부분을 라이브러리에 구축하는 구성 옵션이 있습니다 . 몇 년이 지나면서 일부 Linux 기반 배포판에서는 이를 패키지에 통합했습니다.
bash
커스 함수(libncurses 등)를 사용하지 않기 때문에 libtinfo
.
readline
termcap 특정 부분입니다 bash
(실제로 처음 접했을 때 bash
termcap 부분은 다음과 같습니다.하드코딩된, 공식 소스는 termcap을 사용하지만 아마도 더 많은 바이트를 절약하기 위해). bash
번들 빌드를 사용할 때 readline
번들을 (충돌 가능성이 있는) 공유 라이브러리로 설치하는 것은 readline
의미가 없기 때문에 이를 별도의 라이브러리로 취급하지 않습니다. readline
그러나 (시스템에 따라) libtinfo
ncurses는 둘 다 아닌 한 가지 방식(분할 여부)으로 구축되기 때문에 이를 볼 수 있습니다.