আকার পরিবর্তনযোগ্য সিরিয়াল কনসোল উইন্ডো?


25

আমার সিস্টেম ক্রমিক কনসোল ব্যবহার করার সময় আমি সবসময় দিয়ে শেষ $COLUMNS=80এবং $LINES=24

আমি যখন এই ভেরিয়েবলগুলি ম্যানুয়ালি পরিবর্তন করতে পারি তখন ক্লায়েন্টের পাশের টার্মিনাল উইন্ডোটি পুনরায় আকার দেওয়া হয়ে গেলে এটি করা কিছুটা বিরক্তিকর।

সাধারণত আমি কনসোলটি ব্যবহার করে সংযোগ করছি screen /dev/mytty baudrate

পরিবর্তন করা হচ্ছে $TERM"স্ক্রীন" বা "xterm" থেকে এনভায়রনমেন্ট ভেরিয়েবল সাহায্য করে না।

আমার gettyভিটি 100 এর পরিবর্তে কারও সাথে কল করার দরকার আছে ?

আমি ssh ব্যবহার করে যখন একই মেশিনে সংযুক্ত হই তখন এই সমস্তটি সূক্ষ্মভাবে কাজ করে তা বলাই বাহুল্য।

উত্তর:


26

আমার মন্তব্য করার আগে মন্তব্যকারীদের মতো resizeপ্রতিটি কমান্ডের পরে কল করার বিকল্প নেই , যদি আপনার কাছে এই কমান্ড না থাকে এবং আপনি যেখানে প্যাকেজটি ইনস্টল করতে চান না ( xterm) সেখানে থাকে তবে এখানে দুটি পসিক্স শেল স্ক্রিপ্ট রয়েছে যা একই কাজ করে এএনএসআই টার্মিনাল এস্কেপ কোডগুলি ব্যবহার করে:

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"
}

বিটিডাব্লু, আমার .profileফাইলে আপনি নিম্নলিখিতটি পাবেন: [ $(tty) = /dev/ttyS0 ] && res যাতে টার্মিনালটির আকারটি প্রতিটি লগইনটিতে সিরিয়াল লাইন (যা আমি পরিচালনা করার জন্য ব্যবহার করি) এর উপরে নির্ধারিত হয়, যেমন আপনি ডিভাইসটি পুনরায় বুট করার পরে। পরিবর্তে লাইন থাকার জন্য মন্তব্যগুলিতে আরএসও
দ্বারা ধারণাটি দেখুন যাতে প্রতিটি কমান্ডের পরে পুনরায় আকার পরিবর্তন হয় (নোট করুন যে এএফএইসি যদিও এটি সর্বদা সম্ভব নয় )।[ $(tty) = /dev/ttyS0 ] && trap res2 DEBUGbusybox


3
PS: আরও স্থায়ী [[ $(tty) == /dev/ttyS0 ]] && trap res2 DEBUGকরতে শেল প্রোফাইল কনফিগারেশনের একটিতে যুক্ত করুন (যেমন /etc/profile,, ~/.bash_profile)। এটি প্রতিটি একক কমান্ডের পরে এটি চালিত করবে (যদি আপনি পর্দা / tmux / টার্মিনাল-এমুলেটর সহ উইন্ডোজ / প্যানগুলি পুনরায় আকার দিচ্ছেন তবে এটিই ভাল হবে)।
আরএসউ

2
কয়েক মিনিট এটি ব্যবহারের পরে আমি দ্রুত বুঝতে পারি যে উভয়ই res& res2প্রথম-লগইনে ব্যবহার করা ছাড়া যে কোনও কিছুর জন্য খুব ধীর। আমার মেশিনে, তারা উভয়ই শেষ করতে 0.5 সেকেন্ড নিচ্ছেন ... আমার সমস্ত কমান্ড আস্তে আস্তে দেখানো হচ্ছে (যখন ডিইবিইউজি ট্র্যাপের সাথে ব্যবহৃত হয়)। উপস! থাকতে পারে না। অনুমান করুন আমি ইনস্টল করা হবে xterm
আরএসউ

3
@ পিএফকে এক্সটারম resizeদ্রুত ওয়াহা - সাধারণত 0.002 সেকেন্ড।
আরএসউ

1
@ বার্তা ওহ ওকে, জেনে রাখা ভাল, আমি ভেবেছিলাম এটি একই রকম আচরণ করবে এবং তাই একইভাবে ধীর হয়ে যাবে। আমার মনে আছে যে কোনও busyboxকোনওটি আমার কাছে ঠিক ততটাই ধীর বলে মনে হয়েছিল।
পিএইচকে

1
এই একক সমাধানের জন্য ধন্যবাদ। আমি একটি কনসোল-কেবল ডিস্ট্রো ব্যবহার করছি যা এক্স 11 বা এক্সটার্ম ইনস্টলড নেই তাই resizeকোনও বিকল্প নয়।
থম_নিকি

16

কেবল রেকর্ডের জন্য, এখানে এই সমস্যার উত্তর দেওয়া হয়েছে (ইউজনেট জিতেছে):

কনসোল অ্যাপ্লিকেশন ভার্চুয়াল টার্মিনাল অ্যাপ্লিকেশন (ভিতরে চলমান xterm, rxvtএবং বন্ধুদের) পাবেন SIGWINCHপর পুনরায় আকার দেওয়ার অপারেশন সঞ্চালিত হয়েছে। সুতরাং অ্যাপ্লিকেশনটি সংশ্লিষ্ট সিগন্যাল হ্যান্ডলারে উইন্ডো ইত্যাদি পুনরায় আঁকতে সক্ষম হবে।

দুর্ভাগ্যক্রমে সিরিয়াল কনসোল ব্যবহার করার সময়, এরকম কোনও ব্যবস্থা নেই।

তবে অ্যাপ্লিকেশনের পক্ষে সক্রিয়ভাবে বর্তমান কনসোল উইন্ডো আকারের জন্য জিজ্ঞাসা করা সম্ভব । সুতরাং দ্বিতীয় সেরাটি হ'ল এটি করা প্রতিবার শেল দ্বারা একটি কমান্ড প্রম্পট প্রিন্ট করা হয়।

প্রথমে এক্সিকিউটেবলের জন্য একটি বিশেষ আকার পরিবর্তন করতে এবং তারপরে নিম্নলিখিতটি ব্যবহার করে এটি অর্জন করা যেতে পারে bashrc:

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

অবশ্যই এটি রানটাইমের সময় কনসোল অ্যাপ্লিকেশনটিতে কনসোল আকারের সেটিংস পরিবর্তন করবে না।


1
এটা সিরিয়াল লাইন ধরে একটি প্রোটোকল চালানোর জন্য, সেটা সম্ভব হওয়া উচিত নেই সব বৈশিষ্ট্য উপলব্ধ করা? মানে আমাদের কাছে ক্লায়েন্ট এবং সার্ভার রয়েছে। তারা কেবলমাত্র সবকিছু করতে ইনব্যান্ড এস্কেপ সিকোয়েন্সগুলি ব্যবহার করতে পারে এবং এখনও একটি সরল পাঠ্য সিরিয়াল কনসোল নিয়ে কাজ করতে পারে!
Evi1M4chine

1
প্রকৃতপক্ষে, কোডটিতে করা মন্তব্যটি এটিকে পরিষ্কার করে দেয় যে এটি resizeআপনার সিস্টেমে ইনস্টল করা সংস্করণ নয় ।
টমাস ডিকি

9

যেমন "রিসাইজেবল" টার্মিনাল NAWS ফলে হয় ( Negotiate About Window Sizeথেকে বোঝায় যা RFC 1073 টেলনেট উইন্ডোর আকার অপশন )।

আপনি যদি সিরিয়াল পোর্ট ব্যবহার করে সরাসরি কম্পিউটারের সাথে সংযুক্ত থাকেন তবে কোনও আলোচনার জড়িত থাকে না এবং কম্পিউটারটি আপনার টার্মিনালের স্ক্রিন-আকারের সরাসরি জ্ঞান রাখে না।

যদি কোনও টার্মিনাল আকারের সাথে আলোচনা করতে পারে, কম্পিউটারটি SIGWINCHতাদের টার্মিনালটির স্ক্রিনাইজটি আপডেট করার জন্য টার্মিনালটিতে চলমান অ্যাপ্লিকেশনগুলিতে প্রেরণ করবে ।

কম্পিউটারটি যখন স্ক্রিনসাইজটি জানে না, তখন এটি সাধারণত stty -a(সারি এবং কলাম) দ্বারা প্রদর্শিত আকারটি শূন্যে সেট করে । ইন্টারেক্টিভ ব্যবহারের জন্য, এটি কিছুটা বন্ধুত্বপূর্ণ এবং কিছু সিস্টেম পরিবেশ পরিবর্তনশীল LINESএবং COLUMNSসহায়তা করতে ব্যবহার করে to নির্ধারিত মানগুলি টার্মিনাল বিবরণ থেকে উদ্ভূত হতে পারে; প্রায়শই তারা কেবল হার্ডকোডযুক্ত হয়। এই ভেরিয়েবলগুলির জন্য কনভেনশনটির প্রয়োজন যে এগুলি কার্যকরভাবে কার্যকরভাবে দমন না করা, উদাহরণস্বরূপ, অভিশাপ অ্যাপ্লিকেশন use_envকার্যক্রমে কার্যকর করা উচিত। ইতিবাচক দিক থেকে, যখন কোনও নির্ভরযোগ্য তথ্য না পাওয়া যায় তখন এই পরিবর্তনগুলি কার্যকর হতে পারে। নেতিবাচক দিক থেকে, এই ভেরিয়েবলগুলি পরিবর্তন করার জন্য কোনও সুবিধাজনক পদ্ধতি নেই।

resizeপ্রোগ্রাম (একটি ইউটিলিটি সাথে উপলব্ধ করা xterm) স্ক্রিন সাইজ নির্ধারণের জন্য VT100 ধাঁচের কার্সার অবস্থানে প্রতিবেদন পালাবার ক্রম ব্যবহার করতে পারেন। এটি কমান্ড-লাইন থেকে চালানো যেতে পারে; এটি স্বয়ংক্রিয়ভাবে করার কোনও সুবিধাজনক উপায় নেই (আবার)। পার্শ্ব-প্রতিক্রিয়া হিসাবে, resizeসারি / কলামগুলিতে প্রদর্শিত তথ্য আপডেট করে stty। আপডেট এনভায়রনমেন্ট ভেরিয়েবল প্রদানের জন্য এর ব্যবহারের ধরনের এই, যেখানে যেমন মামলা জন্য প্রধানত দরকারী LINESএবং COLUMNS করছে সেট, এবং আপডেট করতে হবে।


3

আমার এম্বেডড লিনাক্স সিস্টেমে ওভারো চলমান অ্যাংস্ট্রোম) এ আমার পক্ষে আরও দুর্দান্ত সমাধান করেছে। আমি কেবল এটি আমার .bashrc ফাইল থেকে চালিয়েছি। আমি পুনরায় আকারটি ব্যবহার করতে চাইনি কারণ এর জন্য কিছু এক্স প্যাকেজ ইনস্টল করা দরকার, এবং আমি তা চাইনি।

আপনার রাস্পবেরি পাইকে বলা হচ্ছে যে আপনার টার্মিনালটি 24 লাইনের চেয়ে বড় অগভীর চিন্তা ব্লগ


3
দয়া করে কেবল একটি লিঙ্ক পোস্ট করবেন না: প্রাসঙ্গিক বিবরণ অন্তর্ভুক্ত করুন যাতে তথ্যও এখানে পাওয়া যায় ...
জেসনওয়ারিয়ান

1
খুব খারাপ এটি পাইথন প্রয়োজন।
ক্রেগ ম্যাককুইন


1

সিরিয়াল লাইনে শেল সেশন চালানোর সময় resizeসংযোগ স্থাপনের পরে এবং প্রতিটি টার্মিনাল জ্যামিতির পরিবর্তনের পরে - সেই সেশনের অভ্যন্তরে কমান্ডটি কল করা যথেষ্ট ।

resizeকমান্ড xterm অংশ কিন্তু ব্যবহারে X11 উপর নির্ভর করে না। উদাহরণস্বরূপ, ফেডোরায় এটি পৃথকভাবে প্যাকেজ করা আছে xterm-resize

এটি কীভাবে কাজ করে: আকার পরিবর্তন কমান্ড কিছু কার্সার আন্দোলনের মধ্য দিয়ে উচ্চতা / প্রস্থ পরিমাপ করে এবং তারপরে এই মানগুলিকে এস্কেপ সিকোয়েন্সগুলির মাধ্যমে টার্মিনালে প্রেরণ করে।

Zsh এর মতো একটি শেলের সাথে এটি স্বয়ংক্রিয়ভাবেও LINESএবং COLUMNSভেরিয়েবলগুলি আপডেট করে (বিকল্পভাবে, কেউ স্ট্যান্ডআউটে প্রিন্ট করা কমান্ড এক্সপোর্ট স্টেটমেন্টগুলি মূল্যায়ন করতে পারে)।

কেন এটি প্রয়োজনীয়: একটি স্থানীয় বা ssh অধিবেশন দিয়ে টার্মিনালটি জ্যামিতির পরিবর্তনগুলি (সিএফ। সিগওয়াইনচ) সম্পর্কে সেশনটি সংকেত দিতে সক্ষম হয়। এই প্রক্রিয়াটি সিরিয়াল সংযোগে কাজ করে না।


0

এখানে সহজ এবং দ্রুত পুনরায় আকার ফাংশন যা কেবল ব্যাশের জন্য কাজ করে। টাইমআউটটি read -d delimপড়া শেষ করতে দেওয়া এড়াতে ব্যাশের ব্যবহার করে এটি পিএইচকে এর রেজ 2 থেকে পরিবর্তিত হয়েছে ।

resize() {
  old=$(stty -g)
  stty -echo
  printf '\033[18t'
  IFS=';' read -d t _ rows cols _
  stty "$old"
  stty cols "$cols" rows "$rows"
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.