ทำไม 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 นี่เป็นระบบ fedora แต่มันเหมือนกันบน Ubuntu และฉันสังเกตเห็นบน raspbian (ตัวแปร debian) มันยังเชื่อมโยงไปยัง libncurses ด้วย

อะไรคือเหตุผลนี้ ฉันคิดว่าทุกอย่างทุบตีสามารถทำได้ด้วย libreadline (ซึ่งอยากรู้อยากเห็นมันไม่ได้เชื่อมโยงไป) นี่เป็นเพียงสิ่งทดแทนสิ่งนั้นหรือไม่?


มันเป็นส่วนหนึ่งของ ncurses? คำอธิบายแพ็คเกจ ( ไลบรารี terminfo ระดับต่ำที่ใช้ร่วมกันสำหรับการจัดการเทอร์มินัล ) ไม่ได้พูดอะไร ( packages.ubuntu.com/trusty/libtinfo5 ) และฟังดูสมเหตุสมผลสำหรับเชลล์ที่มี อาจจำเป็นสำหรับค่าของTERM? โอ้ไม่เคยคิด - ncursesฉันเห็นแพคเกจมาเป็น
muru

zshเชื่อมโยงไปยัง libtinfo ด้วย
cuonglm

คำตอบ:


17

หากคุณเรียกใช้bashเป็น:

LD_DEBUG=bindings bash

บนระบบ GNU และ grep สำหรับ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 สำหรับสัญลักษณ์ใด ๆ เหล่านี้จะอธิบายสิ่งที่พวกเขากำลังทำอยู่:

$ 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มีการพัฒนาควบคู่ไปกับการโดยบุคคลคนเดียวกันและรวมอยู่ในแหล่งที่มาของbashbash

เป็นไปได้ที่จะสร้างbashการเชื่อมโยงกับระบบที่ติดตั้งlibreadlineแต่ถ้าเป็นรุ่นที่เข้ากันได้และนั่นไม่ใช่ค่าเริ่มต้น คุณจำเป็นต้องเรียกใช้สคริปต์ในเวลารวบรวมกับconfigure--with-installed-readline


2

bashเป็นtermcapแอพลิเคชันผ่านreadlineเหมือนscreenและบางส่วนโปรแกรมอื่น ๆ ในส่วนระบบ Linux-based (นอกเหนือจาก Slackware), คุณอาจจะเห็น ncurses เป็นพื้นฐานการดำเนินงานของtermcap

หน้าคู่มือสำหรับtgetent (ชื่อcurs_termcapเพราะนั่นคือวิธีที่มันได้ทำใน SVr4 ... ) พูดว่า:

รูทีนเหล่านี้รวมอยู่ในเครื่องมือช่วยการแปลงสำหรับโปรแกรมที่ใช้ไลบรารีtermcap พารามิเตอร์เหล่านี้เหมือนกันและรูทีนถูกจำลองโดยใช้ ฐานข้อมูลterminfo ดังนั้นจึงสามารถใช้เพื่อสืบค้นความสามารถของรายการที่มีการรวบรวมรายการterminfoเท่านั้น

นั่นคือถ้าโปรแกรมการเรียกไม่ได้ดูข้อมูลที่ส่งคืนอย่างใกล้ชิดและใช้อินเตอร์เฟส termcap ทั่วไปสำหรับการอ่านคำอธิบายเทอร์มินัลและการเขียนข้อมูลไปยังหน้าจอมันจะทำงานเหมือนกับ termcap ดั้งเดิม

แอปพลิเคชัน termcap ส่วนใหญ่ไม่ได้มองอย่างใกล้ชิด (xterm เป็นข้อยกเว้นที่หายาก - ดูคำถามที่พบบ่อย ) ดังนั้นbashทำงานร่วมกับ ncurses

อย่างไรก็ตามไลบรารี termcap มีขนาดเล็กกว่า ncurses ค่อนข้างนานมาแล้วที่สำคัญและตั้งแต่ปี 1997 ncurses มีตัวเลือกการกำหนดค่า--with-termlibที่ทำให้มันสร้างส่วนเฉพาะ termcap- และ terminfo เฉพาะเป็นไลบรารีที่แยกจากฟังก์ชั่นที่จำเป็นในไลบรารี curses ระดับสูงกว่า ไม่กี่ปีที่ผ่านมาและดิสทริบิวชันส่วนหนึ่งที่ใช้ลินุกซ์นั้นรวมอยู่ในแพ็คเกจของพวกเขา

เนื่องจากbashไม่ได้ใช้ใด ๆ ของฟังก์ชั่นการสาปแช่ง (libncurses ฯลฯ ) libtinfoก็สมควรที่จะเชื่อมโยงเฉพาะกับ

readlineเป็นส่วนเฉพาะ termcap ของbash(จริง ๆ แล้วเมื่อฉันพบครั้งแรกbashส่วน termcap ของมันถูกhardcodedแม้ว่าแหล่งที่มาอย่างเป็นทางการใช้ termcap - บางทีอาจจะบันทึกอีกไม่กี่ไบต์) เมื่อbashสร้างขึ้นด้วยบันเดิreadlineลคุณจะไม่เห็นreadlineเป็นไลบรารีแยกต่างหากเนื่องจากจะไม่มีจุดในการทำให้การreadlineติดตั้งแบบบันเดิลนั้นเป็นไลบรารีแบบแบ่งใช้ (อาจขัดแย้งกัน) แต่ (ขึ้นอยู่กับระบบของคุณ) คุณอาจเห็นlibtinfoเพราะ ncurses สร้างขึ้นทางเดียวหรืออีกวิธีหนึ่ง (แยกหรือไม่) - ไม่ใช่ทั้งสองอย่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.