मुझे टर्मिनल विंडो की चौड़ाई और ऊंचाई कैसे पता चलेगी?


295

एक सरल उदाहरण के रूप में, मैं एक सीएलआई स्क्रिप्ट लिखना चाहता हूं जो =टर्मिनल विंडो की पूरी चौड़ाई में प्रिंट कर सकती है ।

#!/usr/bin/env php
<?php
echo str_repeat('=', ???);

या

#!/usr/bin/env python
print '=' * ???

या

#!/usr/bin/env bash
x=0
while [ $x -lt ??? ]; do echo -n '='; let x=$x+1 done; echo

मैंने इस छोटे नोड को बनाया है। लगातार विंडो-साइज़ npmjs.com/package/window-size
jonschlinkert

जवाबों:


562
  • tput cols आपको कॉलम की संख्या बताता है।
  • tput lines आपको पंक्तियों की संख्या बताता है।

11
echo -e "lines\ncols"|tput -Sप्राप्त करने के लिए दोनों लाइनों और कॉलम देखें: linux.about.com/library/cmd/blcmdl1_tput.htm
nickl-

4
tputटर्मिनल की स्थिति को पढ़ने, कर्सर और पाठ गुणों को नियंत्रित करने के लिए बहुत सारी कमांड के साथ एक महान कमांड है , और इसी तरह।
ड्रू नोक

2
हैंडी उर्फ, उदाहरण के लिए: alias dim="echo $(tput cols)x$(tput lines)"जिसके परिणामस्वरूप हो सकता है 80x50
बिशप

2
यह क्यू एंड ए शायद यूनिक्स या सुपरस्यूसर एसई साइटों पर है।
mydoghasworms

2
@ आपके द्वारा प्रदत्त उपनाम आदेश का मूल्यांकन तब किया जाता है जब शेल खट्टा हो जाता है। आपको उपनाम आदेश के लिए एकल उद्धरण का उपयोग करने की आवश्यकता है। जैसे: alias dim='echo Terminal Dimensions: $(tput cols) columns x $(tput lines) rows'
ब्रेंडनसम्पकिंस

103

बैश में, $LINESऔर $COLUMNSपर्यावरण चर चाल करने में सक्षम होना चाहिए। टर्मिनल आकार में किसी भी परिवर्तन पर स्वचालित रूप से सेट किया जाएगा। (यानी SIGWINCH संकेत)


18
हालाँकि, ये पर्यावरण चर केवल बैश करने के लिए उपलब्ध हैं, न कि बैश के अंदर चलने वाले किसी भी प्रोग्राम (जैसे पर्ल, पाइथन, रूबी) के लिए।
Br.Bill

9
यह कुछ भी काम नहीं करता है, लेकिन इंटरएक्टिव बैश सत्र (यदि आप स्क्रिप्ट चलाते हैं तो यह इंटरएक्टिव नहीं है)। एकमात्र स्थान जिसे आप स्क्रिप्ट में उपयोग कर सकते हैं वह है bash में prompt_command।
डोंचो गुनचेव

1
वास्तव में, यह गैर-इंटरैक्टिव स्क्रिप्ट में काम करता है, यदि आप checkwinsizeविकल्प सेट करते हैं । उदाहरण के लिए, यह गैर-संवादात्मक स्क्रिप्ट टर्मिनल के आयामों को प्रिंट करेगी जिस पर इसे चलाया जाता है: shopt -s checkwinsize; (:); echo $LINES $COLUMNS( checkwinsizeविकल्प केवल समाप्त होने के इंतजार के बाद चर को आरंभ करता है, यही कारण है कि हमें (:)कथन की आवश्यकता है )
user3340662

$LINESऔर भेजे $COLUMNSजाने के बाद अद्यतन किए जाते हैं SIGWINCH, वास्तव में किसी भी इंटरैक्टिव कमांड निष्पादन के बाद। यदि आप अपने PS1साथ अपडेट करने का प्रयास trap SIGWINCHकरते हैं $LINESऔर उपयोग नहीं कर सकते हैं $COLUMNS, तो वे
gavenkoa

LINESऔर COLUMNSकेवल बैश द्वारा शेल चरों के रूप में सेट किया जाता है । बैश उन्हें पर्यावरण चर के रूप में सेट नहीं करेगा , जब तक आप इन शेल चर को निर्यात नहीं करते हैं।
मार्कस कुह्न

67

और वहाँ stty, coreutils से

$ stty size
60 120 # <= sample output

यह क्रमशः पंक्तियों और स्तंभों की संख्या, या ऊंचाई और चौड़ाई को प्रिंट करेगा।

तब आप cutया तो या awkइच्छित भाग को निकालने के लिए उपयोग कर सकते हैं।

वह stty size | cut -d" " -f1ऊंचाई / रेखाओं के stty size | cut -d" " -f2लिए और चौड़ाई / स्तंभों के लिए है


यह शैली PIPE के साथ काम नहीं कर सकती, सुझाव है कि tput शैली का उपयोग करें।
liuyang1

6
tput के साथ समस्या यह है कि यह हमेशा उपलब्ध नहीं है, जबकि स्टटी हर ट्टी में उपलब्ध है। उस जानकारी के लिए धन्यवाद!
.स

16
yes = | head -n$(($(tput lines) * $COLUMNS)) | tr -d '\n'

3
सवाल का सीधा जवाब नहीं है, लेकिन एक शानदार डेमो स्क्रिप्ट है।
क्रिस पेज

क्या शानदार उदाहरण है!
कर्ट झोंग

1
कैसे बिल्ली मैं trइन सभी वर्षों के आदेश याद किया ? (फेसपालम)
मार्को मासेंज़ियो

यह कौनसी भाषा है? यह वाक्यविन्यास त्रुटियों के साथ एक शेल स्क्रिप्ट की तरह अस्पष्ट दिखता है। (शेल में आपके पास असाइनमेंट के चारों ओर रिक्त स्थान नहीं हो सकते हैं, और पहला पाइप जगह से बाहर लगता है।)
ट्रिपलआई

2
yes '='अनंत संख्या में '=' ​​लाइनों का उत्पादन करेगा और निम्नलिखित कमांड टर्मिनल को भरने के लिए पर्याप्त व्यवस्थित करेगा
पिक्सेलबीट

12

विंडोज सीएलआई वातावरण में ऐसा करने के लिए, मुझे सबसे अच्छा तरीका मिल सकता है कि मोड कमांड का उपयोग करें और आउटपुट को पार्स करें।

function getTerminalSizeOnWindows() {
  $output = array();
  $size = array('width'=>0,'height'=>0);
  exec('mode',$output);
  foreach($output as $line) {
    $matches = array();
    $w = preg_match('/^\s*columns\:?\s*(\d+)\s*$/i',$line,$matches);
    if($w) {
      $size['width'] = intval($matches[1]);
    } else {
      $h = preg_match('/^\s*lines\:?\s*(\d+)\s*$/i',$line,$matches);
      if($h) {
        $size['height'] = intval($matches[1]);
      }
    }
    if($size['width'] AND $size['height']) {
      break;
    }
  }
  return $size;
}

मुझे आशा है कि यह उपयोगी है!

नोट : ऊँचाई दी गई बफ़र में पंक्तियों की संख्या है, यह विंडो के भीतर दिखाई देने वाली लाइनों की संख्या नहीं है। किसी भी बेहतर विकल्प वहाँ?


3
इसके साथ एक समस्या नोट करें: इस कमांड का आउटपुट स्थानीय-विशिष्ट है। दूसरे शब्दों में, यह किसी अन्य विंडोज लोकेल पर काम नहीं करेगा। यह मुझे विंडोज 7 पर मिलता है: i.imgur.com/Wrr7sWY.png
कैमिलो मार्टिन

उस के समाधान के साथ एक उत्तर जोड़ा गया। +1 हालांकि!
कैमिलो मार्टिन

10

POSIX पर, अंत में आप TIOCGWINSZ(Get Window SiZe) ioctl()कॉल को इनवॉइस करना चाहते हैं । अधिकांश भाषाओं के लिए कुछ प्रकार के आवरण होने चाहिए। उदाहरण के लिए पर्ल में आप शब्द का उपयोग कर सकते हैं :: आकार :

use Term::Size qw( chars );

my ( $columns, $rows ) = chars \*STDOUT;

1
इसके लिए धन्यवाद - मुझे सही दिशा में ले गया। अमृत: एर्लांग:io.columns : io:columns(). erlang.org/doc/man/io.html#columns-0
हेनरिक एन

2
TIOCGWINSZPOSIX मानक में कोई भी नहीं है और ioctl()केवल अप्रचलित STREAMS सुविधा के लिए परिभाषित किया गया है।
ऑसविन

4

जैसा कि मैंने गद्य के उत्तर में उल्लेख किया है, उसका कोड गैर-अंग्रेजी लोकेल विंडोज पर विफल हो जाएगा, क्योंकि तब आउटपुट में mode"कॉलम" या "लाइनें" नहीं हो सकती हैं:

                                         मोड कमांड आउटपुट

आप पाठ की तलाश किए बिना सही विकल्प ढूंढ सकते हैं:

 preg_match('/---+(\n[^|]+?){2}(?<cols>\d+)/', `mode`, $matches);
 $cols = $matches['cols'];

ध्यान दें कि मैं भी लाइनों से परेशान नहीं हूं क्योंकि यह अविश्वसनीय है (और मैं वास्तव में उनके बारे में परवाह नहीं करता हूं)।

संपादित करें: विंडोज 8 (ओह यू ...) के बारे में टिप्पणियों के अनुसार, मुझे लगता है कि यह अधिक विश्वसनीय हो सकता है:

 preg_match('/CON.*:(\n[^|]+?){3}(?<cols>\d+)/', `mode`, $matches);
 $cols = $matches['cols'];

हालांकि इसका परीक्षण करें, क्योंकि मैंने इसका परीक्षण नहीं किया था।


आपका तरीका Win8 में काम नहीं करता है। मैं एक से अधिक हो जाता हूं--- लाइन । i.imgur.com/4x02dqT.png
एमपीएन

@ मर्क वेल, ग्रेट, जो कि सिर्फ सुंदर है। धन्यवाद विंडोज। <3 (अधिक प्रासंगिक नोट पर: मैं देखूंगा कि कैसे ठीक किया जाए ... जब विंडोज 9 बाहर आता है: पी)।
कैमिलो मार्टिन

इस तरह से मैं यह कर रहा हूँ $mode = `mode`; list($rows, $cols) = array_slice(preg_split('/\n/', substr($mode, strpos($mode, 'CON:'))), 2, 2);:। और फिर मैं बस सब कुछ लेकिन संख्याओं को प्रतिस्थापित करता हूं।
अलेक्सांद्र माकोव

@AleksandrMakov मुझे आश्चर्य है कि क्या होता है अगर वहाँ की तरह भाषाओं के साथ आदेश है CON device status:? हो सकता है कि कुछ ऐसा मिलान CON.*:करना बेहतर होगा।
कैमिलो मार्टिन

1
@ मर्क मैं वास्तव में खुद से उस सटीक बात पर सवाल कर रहा था। मैंने ऐसा क्यों किया? संदेह में, मैंने सिर्फ यह मान लिया कि कुछ कारण था और इसके साथ, लोल।
कैमिलो मार्टिन

1

@ पिक्सेलबीट के जवाब से प्रेरित होकर, यहाँ एक क्षैतिज बार अस्तित्व में लाया गया tput, जिसमें printfपैडिंग / फिलिंग का मामूली दुरुपयोग औरtr

printf "%0$(tput cols)d" 0|tr '0' '='

0

कुछ ऐसे मामले हैं जहां आपकी पंक्तियाँ / लाइनें और कॉलम "टर्मिनल" के वास्तविक आकार से मेल नहीं खाते हैं। शायद आपके पास एक "tput" या "stty" उपलब्ध न हो।

यहां एक बैश फ़ंक्शन है जिसका उपयोग आप नेत्रहीन आकार की जांच करने के लिए कर सकते हैं। यह 140 कॉलम x 80 पंक्तियों तक काम करेगा। आप आवश्यकतानुसार अधिकतम अधिकतम समायोजित कर सकते हैं।

function term_size
{
    local i=0 digits='' tens_fmt='' tens_args=()
    for i in {80..8}
    do
        echo $i $(( i - 2 ))
    done
    echo "If columns below wrap, LINES is first number in highest line above,"
    echo "If truncated, LINES is second number."
    for i in {1..14}
    do
        digits="${digits}1234567890"
        tens_fmt="${tens_fmt}%10d"
        tens_args=("${tens_args[@]}" $i)
    done
    printf "$tens_fmt\n" "${tens_args[@]}"
    echo "$digits"
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.