টার্মিনাল উইন্ডোর প্রস্থ এবং উচ্চতা কীভাবে খুঁজে পাব?


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লাইন এবং কলস
নিকল- ২l

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পরিবেশগত ভেরিয়েবলগুলি কৌতুকটি করতে সক্ষম হওয়া উচিত। টার্মিনালের আকারের যে কোনও পরিবর্তনের পরে এটি স্বয়ংক্রিয়ভাবে সেট হয়ে যাবে। (অর্থাত্ সাইনচিন সিগন্যাল)


18
যাইহোক, এই পরিবেশের পরিবর্তনশীলগুলি কেবল বাশের জন্য উপলব্ধ এবং ব্যাশের অভ্যন্তরে চলমান কোনও প্রোগ্রামগুলিতে নয় (যেমন পার্ল, পাইথন, রুবি)।
জুনিয়র বিল

9
এটি ইন্টারেক্টিভ বাশ সেশন ছাড়া আর কোনও কাজ করে না (আপনি স্ক্রিপ্টটি চালালে এটি আর ইন্টারেক্টিভ হয় না)। আপনি কোনও স্ক্রিপ্টে এটি ব্যবহার করতে পারবেন এমন স্থান হ'ল বাশের প্রম্পট_কম্যান্ড।
ডনচো গুনচেভ

1
প্রকৃতপক্ষে, আপনি যদি checkwinsizeবিকল্পটি সেট করেন তবে এটি অ-ইন্টারেক্টিভ স্ক্রিপ্টগুলিতে কাজ করে । উদাহরণস্বরূপ, এই অ-ইন্টারেক্টিভ স্ক্রিপ্টটি যে টার্মিনালটির উপর এটি চালিত হবে সেগুলির মাত্রাগুলি মুদ্রণ করবে: shopt -s checkwinsize; (:); echo $LINES $COLUMNS( checkwinsizeবিকল্পটি কেবল (:)
সাব

$LINESপ্রেরণের $COLUMNSপরে আপডেট হয় এবং SIGWINCHবাস্তবে কোনও ইন্টারেক্টিভ কমান্ড কার্যকর করার পরে। আপনি আপডেট করতে চেষ্টা করুন PS1সঙ্গে trap SIGWINCHআপনি ব্যবহার করতে পারবেন না $LINESএবং $COLUMNSতারা পুরাতন মান ((রাখতে
gavenkoa

LINESএবং COLUMNSকেবল বাশ দ্বারা শেল ভেরিয়েবল হিসাবে সেট করা হয়। আপনি এই শেল ভেরিয়েবলগুলি এক্সপোর্ট না করলে বাশ এগুলি পরিবেশ পরিবর্তনশীল হিসাবে সেট করবে না ।
মার্কাস কুহান

67

এবং কোর্টিলstty থেকে আছে

$ stty size
60 120 # <= sample output

এটি যথাক্রমে সারি এবং কলামগুলির সংখ্যা বা উচ্চতা এবং প্রস্থ মুদ্রণ করবে।

তারপরে আপনি হয় ব্যবহার করতে পারেন cutবা awkআপনার পছন্দসই অংশটি বের করতে পারেন।

এটা stty size | cut -d" " -f1উচ্চতা / লাইন জন্য এবং stty size | cut -d" " -f2প্রস্থ / কলামের জন্য


এই স্টাইলটি পিআইপিই দিয়ে কাজ করতে পারে না, টিপুট শৈলী ব্যবহারের পরামর্শ দেয়।
liuyang1

6
টিপুট সমস্যাটি হ'ল এটি সর্বদা উপলব্ধ থাকে না যখন প্রতিটি টিটিটিতে স্টটি উপলব্ধ থাকে। তথ্যের জন্য ধন্যবাদ!
আইআরএস

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 এ পেয়েছি
ক্যামিলো মার্টিন

একটি সমাধান সঙ্গে একটি উত্তর যুক্ত। +1 যদিও!
ক্যামিলো মার্টিন

10

TIOCGWINSZপজিক্সে , শেষ পর্যন্ত আপনি (উইনডো সিজে পান) ioctl()কলটি করতে চান। বেশিরভাগ ভাষায় এর জন্য কিছু প্রকারের আবরণ থাকা উচিত। যেমন পার্লে আপনি শব্দটি ব্যবহার করতে পারেন :: আকার :

use Term::Size qw( chars );

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

1
এর জন্য ধন্যবাদ - আমাকে সঠিক পথে নিয়ে গেছে। এলিক্সির : :io.columnsএরলং: io:columns(). এরলং.আর্গ
হেনরিক এন

2
কোন ব্যাপার TIOCGWINSZPOSIX মান এবং ioctl()লুপ্তপ্রায় জন্য বৈশিষ্ট্যর প্রবাহের শুধুমাত্র সংজ্ঞায়িত করা হয়।
osvein

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);। এবং তারপরে আমি কেবল সংখ্যা ব্যতীত সমস্ত কিছু প্রতিস্থাপন করব।
আলেকসান্দ্র মাকভ

@ আলেকসান্দ্রমাকভ আমি ভাবছি যে যদি ভাষা মত শৃঙ্খলাযুক্ত ভাষা হয় তবে কি হয় CON device status:? হয়তো এর মতো কিছু মিললে CON.*:আরও ভাল কাজ হবে।
ক্যামিলো মার্টিন

1
@ মার্ক আমি আসলে নিজেকে সেই সঠিক জিনিসটি নিয়ে প্রশ্ন করছিলাম। হেক কেন আমি এটা করেছি? সন্দেহ নেই, আমি ঠিক ধরেছি যে এর কোনও কারণ আছে এবং এটি নিয়ে চলেছি, হ্যাঁ।
ক্যামিলো মার্টিন

1

@ পিক্সেলবিটের উত্তরে অনুপ্রাণিত হয়ে, এখানে একটি অনুভূমিক বার উপস্থিত হয়েছে tput, printfপ্যাডিং / ফিলিংয়ের সামান্য অপব্যবহার এবংtr

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

0

কিছু ক্ষেত্রে রয়েছে যেখানে আপনার সারি / লাইনগুলি এবং কলামগুলি ব্যবহৃত হচ্ছে "টার্মিনাল" এর প্রকৃত আকারের সাথে মেলে না। সম্ভবত আপনার কাছে "টিপুট" বা "স্টাটি" উপলভ্য নাও থাকতে পারে।

আকারটি চাক্ষুষভাবে পরীক্ষা করতে আপনি এখানে ব্যাশ ফাংশন ব্যবহার করতে পারেন। এটি 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"
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.