बैश को नर्सों से क्यों जोड़ा जाता है?


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 का हिस्सा है। यह एक फेडोरा प्रणाली है, लेकिन यह उबंटू पर समान है, और मैं रास्पबियन (एक डेबियन संस्करण) पर ध्यान देता हूं, यह खुद को लिबासर्स्क से भी जोड़ता है।

इसका क्या कारण है? मुझे लगा कि सबकुछ बैश किया जा सकता है जो कि लेबर्रेडलाइन के साथ किया जा सकता है (जो उत्सुकता से, यह लिंक नहीं करता है)। क्या यह केवल उसके लिए एक विकल्प है?


यह ncurses का हिस्सा है? पैकेज विवरण ( साझा टर्मिनल का उपयोग करने के लिए पुस्तकालय terminfo निम्न स्तर ) कुछ भी (कहना नहीं है packages.ubuntu.com/trusty/libtinfo5 ), और करने के लिए एक खोल के लिए यह उचित लगता है। शायद के मूल्यों के लिए आवश्यक है TERM? आह, कोई बात नहीं - मुझे लगता है कि स्रोत पैकेज है ncurses
मूरू

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/bashकि bashtinfo से उन प्रतीकों का उपयोग कर रहा है।

उन प्रतीकों में से किसी के लिए मैन पेज लाना यह स्पष्ट करता है कि वे क्या कर रहे हैं:

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

मूल रूप से bash, अधिक संभावना है कि इसका readline(लिब्रेडलाइन वैधानिक रूप से संपादक में जुड़ा हुआ है), टर्मिनल क्षमताओं के बारे में जानने के लिए टर्मो डेटाबेस का उपयोग करने के लिए उन का उपयोग करता है ताकि यह अपने लाइन संपादक को सही तरीके से चला सके (सही एस्केप अनुक्रमों को भेजना और सही ढंग से कुंजी प्रेस की पहचान करना) टर्मिनल।

जैसा कि रीडलाइन सांख्यिकीय रूप से क्यों जुड़ा हुआ है bash, आपको यह ध्यान रखना होगा कि readlineएक bashही व्यक्ति द्वारा विकसित किया गया है और के स्रोत में शामिल है bash

bashसिस्टम के स्थापित होने के साथ जुड़ा होना संभव है libreadline, लेकिन केवल अगर यह एक संगत संस्करण का है, और यह डिफ़ॉल्ट नहीं है। आपको configureसंकलन समय पर स्क्रिप्ट को कॉल करने की आवश्यकता है --with-installed-readline


2

bashएक है termcap आवेदन के माध्यम से readline, की तरह screenऔर कुछ अन्य कार्यक्रमों। सबसे लिनक्स आधारित प्रणाली (अलग स्लैकवेयर से) पर, आप की संभावना के कार्यान्वयन अंतर्निहित रूप ncurses को देखने के लिए कर रहे हैं termcap

के लिए मैनुअल पेजtgetent (जिसका नाम शाप_वर्मप है, क्योंकि यह एसवीआर 4 में किया गया था ...) कहते हैं:

इन रूटीन को उन प्रोग्राम के लिए रूपांतरण सहायता के रूप में शामिल किया गया है जो टर्मपैक लाइब्रेरी का उपयोग करते हैं । उनके पैरामीटर समान हैं और रूटीनों का उपयोग टर्मोफ डेटाबेस का उपयोग करके किया जाता है। इस प्रकार, उनका उपयोग केवल प्रविष्टियों की क्षमताओं को क्वेरी करने के लिए किया जा सकता है, जिसके लिए एक समाप्ति प्रविष्टि संकलित की गई है।

यही है, अगर कॉलिंग प्रोग्राम लौटाए गए डेटा को बारीकी से नहीं देखता है, और टर्मिनल विवरण को पढ़ने और स्क्रीन पर डेटा लिखने के लिए पारंपरिक टर्मकैप इंटरफ़ेस का उपयोग करता है, तो यह मूल टर्मकैप की तरह ही काम करता है।

अधिकांश अपकमिंग एप्लिकेशन यह नहीं देखते कि बारीकी से (xterm एक दुर्लभ अपवाद है - FAQ देखें )। तो bashncurses के साथ काम करता है।

हालांकि, टर्मकैप लाइब्रेरी ncurses से छोटी है। काफी समय पहले जो मायने रखता था, और 1997 के बाद से ncurses के पास एक कॉन्फ़िगर विकल्प है, --with-termlibजो इसे उच्च-स्तरीय शाप पुस्तकालय में आवश्यक कार्यों से अलग एक पुस्तकालय के रूप में termcap- और termfo- विशिष्ट भागों का निर्माण करता है। कुछ साल बीत गए, और कुछ लिनक्स-आधारित वितरणों ने उन्हें अपने पैकेज में शामिल किया।

चूँकि bashकिसी भी शाप कार्य (libncurses, आदि) का उपयोग नहीं किया जाता है, यह केवल के खिलाफ लिंक करने के लिए उचित है libtinfo

readlinebash( विशेष रूप से जब मैंने पहली बार सामना किया था bash, तब इसके विशिष्ट भाग को हार्डकोड किया गया था , भले ही आधिकारिक स्रोत का उपयोग किया गया था - शायद कुछ और बाइट्स को बचाने के लिए)। जब bashबंडल के साथ बनाया जाता है readline, तो आप readlineएक अलग पुस्तकालय के रूप में नहीं देखेंगे क्योंकि उस बंडल readlineको साझा लाइब्रेरी के रूप में स्थापित करने का कोई मतलब नहीं होगा । लेकिन (आपके सिस्टम के आधार पर), आप देख सकते हैं libtinfoक्योंकि नर्सों को एक तरह से या दूसरे (विभाजन या नहीं) - दोनों में नहीं बनाया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.