हर बार जब कोई वर्चुअल कंसोल के लिए एक अलग आकार निर्धारित करता है, less
तो विंडो रिज़ॉल्यूशन को पहचानता है (मैं मान रहा हूं कि ...); उसके अनुसार, यह बदलता है कि इसे पाठ की कितनी पंक्तियों की कल्पना करनी चाहिए। उस पैरामीटर की गणना कैसे की जाती है?
हर बार जब कोई वर्चुअल कंसोल के लिए एक अलग आकार निर्धारित करता है, less
तो विंडो रिज़ॉल्यूशन को पहचानता है (मैं मान रहा हूं कि ...); उसके अनुसार, यह बदलता है कि इसे पाठ की कितनी पंक्तियों की कल्पना करनी चाहिए। उस पैरामीटर की गणना कैसे की जाती है?
जवाबों:
यदि आप किसी स्क्रिप्ट से जांचने का तरीका ढूंढ रहे हैं, तो आप इनमें से कुछ भी कर सकते हैं:
tput cols
और tput lines
, जैसा कि मैनेटवर्क बताता हैलेकिन यदि आप विवरण चाहते हैं, तो हम यहां जाते हैं:
वर्चुअल टर्मिनल (xterm, et al) के लिए एक ioctl()
सिस्टम कॉल है जो आपको बताएगा कि विंडो किस आकार की है। यदि यह कर सकता है, less
इस कॉल का उपयोग करता है। इसके अलावा, जब आप विंडो का आकार बदलते हैं, तो उस विंडो में जो कुछ भी चल रहा है वह एक SIGWINCH
संकेत प्राप्त करता है less
जो आपको यह बताता है कि इसे नए विंडो आकार के लिए जांचना चाहिए। उदाहरण के लिए, मैंने एक less
रनिंग (प्रक्रिया आईडी 16663 के रूप में) शुरू की, इसके साथ जुड़ा हुआ है strace
, और खिड़की का आकार बदल दिया है। यह वही है जो मैंने देखा:
$ strace -p 16663
Process 16663 attached - interrupt to quit
read(3, 0xbfb1f10f, 1) = ? ERESTARTSYS (To be restarted)
--- SIGWINCH (Window changed) @ 0 (0) ---
rt_sigaction(SIGWINCH, {0x805cf10, [WINCH], SA_RESTART}, {0x805cf10, [WINCH], SA_RESTART}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
ioctl(2, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
यह भी है कि पर्दे के पीछे क्या tput cols
और tput lines
क्या किया जा सकता है। इस पद्धति की अधिक जानकारी के man tty-ioctl
लिए, TIOCGWINSZ देखें और खोजें।
अन्य टर्मिनलों जैसे कि सीरियल पोर्ट से जुड़े लोगों के लिए, हालांकि, इस जानकारी को सीधे प्राप्त करने का कोई तरीका नहीं है। उस स्थिति less
में, पर्यावरण चर में सुराग की तलाश शुरू कर देता है।
LINES
और COLUMNS
अक्सर टर्मिनल आयामों पर सेट किया जाएगा। वास्तव में, अगर bash
या zsh
टर्मिनल आयाम पा सकते हैं , तो यह स्वचालित रूप से इन चरों को स्वयं सेट कर देगा, ताकि टर्मिनल आकार को देखने के लिए नॉट-सोफ्ट प्रोग्राम को आसान बनाया जा सके। हालांकि, अधिकांश अन्य गोले, सहित dash
और tcsh
, इन चर को सेट नहीं करते हैं।TERM
आमतौर पर टर्मिनल प्रकार पर सेट होता है, जिस स्थिति में टर्मिनल डेटाबेस में टर्मिनल का अपेक्षित आकार हो सकता है। यदि tput rows
आप IOCTL का उपयोग नहीं कर सकते हैं (उदाहरण के लिए, यदि आप एक सीरियल पोर्ट से जुड़े हैं), तो यह यहां दर्ज किए गए मानों पर वापस गिर जाएगा। एक टर्मिनल के लिए जिसका आकार बदल सकता है, यह केवल एक अनुमान है और गलत होने की संभावना है।अधिक जानकारी के लिए, man tput
टर्मिनल को नियंत्रित करने के लिए कमांड देखें और man terminfo
उन चीजों की सूची के लिए जिन्हें आप टर्मिनल को करने के लिए कह सकते हैं।
यदि आप स्रोत कोड पर एक नज़र डालते हैं, तो आप लिनक्स पर खिड़की के आकार को पुनः प्राप्त करने के लिए less
कॉल करेंगे ioctl()
।
#ifdef TIOCGWINSZ
{
struct winsize w;
if (ioctl(2, TIOCGWINSZ, &w) == 0)
{
if (w.ws_row > 0)
sys_height = w.ws_row;
if (w.ws_col > 0)
sys_width = w.ws_col;
}
}
#else
#ifdef WIOCGETD
{
struct uwdata w;
if (ioctl(2, WIOCGETD, &w) == 0)
{
if (w.uw_height > 0)
sys_height = w.uw_height / w.uw_vs;
if (w.uw_width > 0)
sys_width = w.uw_width / w.uw_hs;
}
}
#endif
मुझे यकीन नहीं है कि अगर यह वह जानकारी है जिसकी आपको तलाश है। मुझे लगता है कि के less
लिए एक सिग्नल हैंडलर रजिस्टर करता है SIGWINCH
। जब टर्मिनल का आयाम बदलता है, तो यह एक SIGWINCH
संकेत प्राप्त करता है और टर्मिनल के वर्तमान आयाम के लिए tty जानकारी की जांच करता है।
http://www.gnu.org/software/libc/manual/html_node/Miscellaneous-Signals.html