resizable सीरियल कंसोल विंडो?


25

अपने सिस्टम के सीरियल कंसोल का उपयोग करते समय मैं हमेशा के साथ समाप्त हो जाता हूं $COLUMNS=80और $LINES=24

जबकि मैं इन चरों को मैन्युअल रूप से बदल सकता हूं, किसी भी समय ऐसा करना कष्टप्रद है जब क्लाइंट साइड टर्मिनल विंडो को आकार दिया गया है।

आमतौर पर मैं कंसोल का उपयोग करके कनेक्ट कर रहा हूं screen /dev/mytty baudrate

$TERMपर्यावरण चर को "स्क्रीन" या "xterm" में बदलने से मदद नहीं मिलती है।

क्या मुझे gettyvt100 के बजाय उनमें से कुछ के साथ कॉल करने की आवश्यकता होगी ?

यह कहने की आवश्यकता नहीं है कि यह सब ठीक है, जब मैं ssh का उपयोग करके उसी मशीन से जुड़ता हूं।

जवाबों:


26

मेरे उल्लेख करने से पहले टिप्पणीकारों की तरह resizeहर कमांड के बाद कॉल करने का कोई विकल्प नहीं है , यदि आपके पास यह कमांड नहीं है और आप एक पैकेज स्थापित नहीं करना चाहते हैं जहां यह ( xterm) है, तो यहां दो POSIX शेल स्क्रिप्ट हैं जो समान हैं एएनएसआई टर्मिनल एस्केप कोड का उपयोग करना:

res() {

  old=$(stty -g)
  stty raw -echo min 0 time 5

  printf '\0337\033[r\033[999;999H\033[6n\0338' > /dev/tty
  IFS='[;R' read -r _ rows cols _ < /dev/tty

  stty "$old"

  # echo "cols:$cols"
  # echo "rows:$rows"
  stty cols "$cols" rows "$rows"
}

res2() {

  old=$(stty -g)
  stty raw -echo min 0 time 5

  printf '\033[18t' > /dev/tty
  IFS=';t' read -r _ rows cols _ < /dev/tty

  stty "$old"

  # echo "cols:$cols"
  # echo "rows:$rows"
  stty cols "$cols" rows "$rows"
}

BTW, मेरी .profileफाइल में आपको निम्नलिखित मिलेंगे: [ $(tty) = /dev/ttyS0 ] && res ताकि टर्मिनल आकार सीरियल लाइन (प्रबंधन के लिए मैं जो एक का उपयोग करता है) पर हर लॉगिन पर निर्धारित होता है, जैसे कि डिवाइस को रिबूट करने के बाद। टिप्पणियों में rsaw
द्वारा विचार को भी देखें, इसके बजाय वहां लाइन है इसलिए आकार हर कमांड के बाद चलता है (ध्यान दें कि AFAIK यह हमेशा नहीं है या हालांकि हमेशा संभव नहीं है )।[ $(tty) = /dev/ttyS0 ] && trap res2 DEBUGbusybox


3
पुनश्च: अधिक स्थायी बनाने [[ $(tty) == /dev/ttyS0 ]] && trap res2 DEBUGके लिए, शेल प्रोफ़ाइल कॉन्फ़िगरेशन (जैसे /etc/profile, ~/.bash_profile) में से एक में जोड़ें । यह हर एक कमांड के बाद चलाया जाएगा (जो केवल एक अच्छी बात होगी यदि आप स्क्रीन / tmux / टर्मिनल-एमुलेटर के साथ विंडोज़ / पैन का आकार बदल रहे हैं)।
rsaw

2
कुछ मिनट के लिए उपयोग करने के बाद मैं जल्दी से पता चला है कि दोनों resऔर res2कुछ भी लेकिन पहली बार प्रवेश करने पर उपयोग के लिए बहुत धीमी गति से कर रहे हैं। मेरी मशीनों पर, वे दोनों को समाप्त करने के लिए 0.5sec ले रहे हैं ... मेरे सभी आदेश सुस्त दिखाई देते हैं (जब DEBUG जाल के साथ उपयोग किया जाता है)। ओह! ऐसा नहीं हो सकता। मुझे लगता है मैं स्थापित हो जाएगा xterm
rsaw

3
@phk xterm की वाया resizeतेजी से होती है - आमतौर पर 0.002 सेकेंड।
rsaw

1
@rsaw ओह ओके, जानकर अच्छा लगा, मैंने सोचा कि यह समान व्यवहार करेगा और इसलिए समान रूप से धीमा होगा। मुझे याद है कि कुछ busyboxes में से एक के रूप में मुझे धीमा लग रहा था।
phk

1
इस स्टैंडअलोन समाधान के लिए धन्यवाद। मैं कंसोल-ओनली डिस्ट्रो का उपयोग कर रहा हूं जिसमें x11 या xterm स्थापित नहीं resizeहै इसलिए विकल्प नहीं है।
thom_nic

16

सिर्फ रिकॉर्ड के लिए, यहाँ इस समस्या का जवाब है (यूज़नेट जीता):

कंसोल अनुप्रयोग आभासी टर्मिनल अनुप्रयोगों (अंदर चल रहा है xterm, rxvtऔर दोस्तों) प्राप्त होगा SIGWINCHके बाद एक आकार बदलने आपरेशन हुआ है। इस प्रकार अनुप्रयोग संबंधित सिग्नल हैंडलर में विंडो आदि को फिर से रीड करने में सक्षम होगा।

दुर्भाग्य से जब एक सीरियल कंसोल का उपयोग होता है, तो ऐसा कोई तंत्र नहीं होता है।

हालांकि यह वर्तमान कंसोल विंडो के आकार के लिए सक्रिय रूप से पूछने के लिए आवेदन के लिए संभव है । तो दूसरी सबसे अच्छी बात यह है कि हर बार एक कमांड प्रॉम्प्ट शेल द्वारा मुद्रित किया जाता है।

इसे पहले एक विशेष आकार के निष्पादन योग्य संकलन करके और फिर निम्नलिखित का उपयोग करके प्राप्त किया जा सकता है bashrc:

if [ $(tty) == '/dev/ttyS0' ]; then
  trap resize DEBUG
fi

बेशक यह रनटाइम के दौरान कंसोल एप्लिकेशन में कंसोल आकार सेटिंग्स को नहीं बदलेगा।


1
क्या सीरियल लाइन पर प्रोटोकॉल चलाना संभव नहीं है, जो सभी सुविधाओं की पेशकश करता है? मेरा मतलब है कि हमारे पास एक क्लाइंट और एक सर्वर है। वे हर काम के बारे में करने के लिए इनहाउस एस्केप सीक्वेंस का उपयोग कर सकते हैं, और फिर भी एक सादे टेक्स्ट सीरियल कंसोल के साथ काम कर सकते हैं!
Evi1M4chine

1
दरअसल, कोड में टिप्पणी यह ​​स्पष्ट करती है कि यह संस्करण नहीं है, resizeजो आपके सिस्टम पर स्थापित है।
थॉमस डिके

9

जैसे कि "आकार बदलने योग्य" टर्मिनल NAWS का परिणाम हैं ( Negotiate About Window Sizeसे आरएफसी 1073 टेलनेट विंडो आकार विकल्प )।

यदि आप सीरियल पोर्ट का उपयोग करके सीधे कंप्यूटर से जुड़े हैं, तो कोई बातचीत शामिल नहीं है, और कंप्यूटर को आपके टर्मिनल के स्क्रीन-आकार का कोई प्रत्यक्ष ज्ञान नहीं है।

यदि एक टर्मिनल आकार पर बातचीत कर सकता है, तो कंप्यूटर SIGWINCHटर्मिनल में चल रहे अनुप्रयोगों को भेज देगा , उन्हें स्क्रीनसेशन की अपनी धारणा को अपडेट करने के लिए कहेगा।

जब कंप्यूटर स्क्रीनसेवर को नहीं जानता है, तो यह आमतौर पर stty -a(पंक्तियों और स्तंभों) द्वारा दिखाए गए आकार को शून्य पर सेट करता है। इंटरैक्टिव उपयोग के लिए, यह थोड़ा अमित्र है, और कुछ सिस्टम पर्यावरण चर का उपयोग करते हैं LINESऔर COLUMNSमदद करते हैं। निर्दिष्ट मूल्यों को टर्मिनल विवरण से प्राप्त किया जा सकता है; अधिक बार वे केवल हार्डकोड होते हैं। इन चर के लिए कन्वेंशन की आवश्यकता है कि वे प्रभावी रूप से तब तक प्रभावी रहें जब तक कि शाप अनुप्रयोग use_envफ़ंक्शन में, उदाहरण के लिए, दबा न दिया जाए । सकारात्मक पक्ष पर, वे चर उपयोगी हो सकते हैं जब कोई विश्वसनीय जानकारी उपलब्ध नहीं है। नकारात्मक पक्ष पर, उन चर को बदलने के लिए कोई सुविधाजनक तरीका नहीं है।

resizeकार्यक्रम (एक उपयोगिता के साथ प्रदान की xterm) स्क्रीन आकार निर्धारित करने के लिए VT100 शैली कर्सर की स्थिति रिपोर्ट से बच अनुक्रम का उपयोग कर सकते हैं। इसे कमांड-लाइन से चलाया जा सकता है; वहाँ (फिर से) स्वचालित रूप से इसे करने का कोई सुविधाजनक तरीका नहीं है। एक साइड-इफेक्ट के रूप में, resizeपंक्तियों / स्तंभों द्वारा देखी गई जानकारी को अपडेट करता है stty। अद्यतन वातावरण चर प्रदान करने के लिए इसका उपयोग इस तरह है, जहां के रूप में मामलों के लिए मुख्य रूप से उपयोगी है LINESऔर COLUMNS कर रहे हैं निर्धारित करते हैं, और अद्यतन किया जाना चाहिए।


3

यहां एक और समाधान है जो मेरे एम्बेडेड लिनक्स सिस्टम (ओवरो रनिंग एंगस्ट्रॉम) पर मेरे लिए बहुत अच्छा काम करता है। मैंने अभी इसे अपने .bashrc फ़ाइल से चलाया है। मैं आकार परिवर्तन का उपयोग नहीं करना चाहता था क्योंकि कुछ एक्स पैकेजों को स्थापित करने की आवश्यकता है, और मैं ऐसा नहीं चाहता था।

अपने रास्पबेरी पाई को बताना कि आपका टर्मिनल 24 लाइनों से बड़ा है | उथला विचार ब्लॉग


3
कृपया बस एक लिंक पोस्ट न करें: प्रासंगिक विवरण शामिल करें ताकि जानकारी यहाँ भी उपलब्ध हो ...
jasonwryan

1
बहुत बुरा यह अजगर की जरूरत है।
क्रेग मैकक्यून


1

एक सीरियल लाइन पर शेल सत्र चलाते समय, resizeउस सत्र के अंदर कमांड को कॉल करने के लिए पर्याप्त है - कनेक्शन स्थापित करने के बाद और प्रत्येक टर्मिनल ज्यामिति बदलने के बाद।

resizeआदेश टर्म का हिस्सा है लेकिन X11 पर निर्भर नहीं करता। उदाहरण के लिए, फेडोरा पर इसे अलग से पैक किया गया है xterm-resize

यह कैसे काम करता है: आकार परिवर्तन आदेश कुछ कर्सर आंदोलनों के माध्यम से ऊंचाई / चौड़ाई को मापता है और फिर बच के दृश्यों के माध्यम से टर्मिनल को उन मूल्यों को भेजता है।

Zsh जैसे शेल के साथ यह ऑटोमैटिकली भी अपडेट होता है LINESऔर COLUMNSवैरिएबल (वैकल्पिक रूप से, एक्सपोर्ट स्टेटमेंट को कमांड प्रिंट्स को स्टैडआउट में मूल्यांकन कर सकते हैं)।

यह क्यों आवश्यक है: एक स्थानीय या ssh सत्र के साथ टर्मिनल ज्यामिति परिवर्तन (cf. SIGWINCH) के बारे में सत्र को इंगित करने में सक्षम है। यह तंत्र एक सीरियल कनेक्शन पर काम नहीं करता है।


0

यहाँ सरल और तेजी से आकार बदलने वाला फ़ंक्शन है जो केवल बैश के लिए काम करता है। इसे phk के res2 से संशोधित किया गया है, जो read -d delimपढ़ने के समय समाप्त होने से बचने के लिए बैश का उपयोग करता है ।

resize() {
  old=$(stty -g)
  stty -echo
  printf '\033[18t'
  IFS=';' read -d t _ rows cols _
  stty "$old"
  stty cols "$cols" rows "$rows"
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.