bash는 왜 ncurses에 연결됩니까?


11

나는 이것을 전에 알아 차 렸지만 그것에 대해 많이 생각한 적이 없다고 생각합니다. 이제 궁금합니다.

> 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의 일부입니다. 이것은 페도라 시스템이지만 우분투에서도 동일하며 raspbian (데비안 변형)에서도 libncurses 자체와 연결됩니다.

그 이유는 무엇입니까? 나는 bash가 모든 것을 libreadline으로 할 수 있다고 생각했다. 이것은 단순히 그 대체물입니까?


ncurses의 일부입니까? 패키지 설명 ( 터미널 처리를 위해 공유되는 저수준 terminfo 라이브러리 )은 아무 것도 말하지 않으며 ( packages.ubuntu.com/trusty/libtinfo5 ) 쉘이 가지고있는 것이 합리적입니다. TERM?의 값에 필요할 수 있습니다 . 아, 괜찮아요-소스 패키지가 보입니다 ncurses.
muru

zsh또한, 너무 libtinfo 링크를
cuonglm

답변:


17

다음 bash과 같이 실행 하는 경우 :

LD_DEBUG=bindings bash

GNU 시스템 bash.*tinfo에서 그 출력에서 grep 하면 다음과 같은 내용이 표시됩니다.

   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/bashbashtinfo에서 해당 기호를 사용한다.

이러한 기호 중 하나에 대한 매뉴얼 페이지를 가져 오면 해당 내용이 명확 해집니다.

$ 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있음을 명심해야합니다 .readlinebashbash

bash시스템의 installed와 연결 되도록 빌드 할 수 libreadline있지만, 해당 버전이 호환 가능한 버전이고 기본값이 아닌 경우에만 가능합니다. configure로 컴파일 할 때 스크립트 를 호출해야합니다 --with-installed-readline.


2

bashA는 TERMCAP의 응용 프로그램 을 통해 readline같은 screen일부 다른 프로그램. 대부분의 Linux 기반 시스템 (슬랙웨어 제외)에서 ncurses는 termcap의 기본 구현으로 볼 수 있습니다 .

SVr4에서 수행 된 방식이므로 curs_termcap 이라는 이름 의 매뉴얼 페이지tgetent 는 다음과 같이 말합니다.

이러한 루틴은 termcap 라이브러리 를 사용하는 프로그램의 변환 보조 도구로 포함됩니다 . 매개 변수는 동일하며 terminfo 데이터베이스를 사용하여 루틴을 에뮬레이트 합니다. 따라서 terminfo 항목이 컴파일 된 항목의 기능을 쿼리하는 데만 사용할 수 있습니다 .

즉, 호출 프로그램이 리턴 된 데이터를 자세히 보지 않고 터미널 설명을 읽고 화면에 데이터를 쓰는 데 일반 termcap 인터페이스를 사용하는 경우 원래 termcap과 동일하게 작동합니다.

대부분의 termcap 응용 프로그램은 밀접하게 보이지 않습니다 (xterm은 드문 예외입니다-FAQ 참조 ). 그래서 bashncurses를 함께 작동합니다.

그러나 termcap 라이브러리는 ncurses보다 작습니다. 꽤 오래 전에 문제가 되었으며 1997 년부터 ncurses는 구성 옵션 --with-termlib을 사용하여 termcap 및 terminfo 관련 부분을 상위 수준 curses 라이브러리에 필요한 기능과는 별도의 라이브러리로 구축 할 수있었습니다. 몇 년이 지나고 일부 Linux 기반 배포판은이를 패키지에 통합했습니다.

때문에 bash저주 기능 (libncurses 등)을 사용하지 않습니다, 그것은 대하여 만 연결하는 것이 합리적이다 libtinfo.

readline는 termcap 특정 부분입니다 bash(실제로 처음 소스를 봤을 때 공식 소스에서 termcap을 사용했지만 아마도 몇 바이트를 절약하기 위해 bashtermcap 부분이 하드 코딩 되었습니다 ). bashbundled로 빌드 되면 번들 설치를 (충돌 할 수있는) 공유 라이브러리로 만들지 않으므로 별도의 라이브러리로 readline표시되지 않습니다 . 그러나 (시스템에 따라) ncurses가 둘 다가 아닌 하나의 방식으로 구축 되었기 때문에 볼 수 있습니다 .readlinereadlinelibtinfo

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.