বাশ স্ক্রিপ্ট ব্যবহার করে কনসোল প্রস্থ পাওয়া


15

আমি এমন একটি সমস্যার মুখোমুখি হচ্ছি যেখানে আমি স্ক্রিপ্ট ব্যবহার করে টার্মিনালের আকার পাওয়ার চেষ্টা করছি। সাধারণত আমি tput colsকনসোলের ভিতরে কমান্ডটি ব্যবহার করব , তবে আমি স্ক্রিপ্টগুলি কঠোরভাবে ব্যবহার করে এই বৈশিষ্ট্যটি সম্পাদন করতে সক্ষম হতে চাই।

এখন পর্যন্ত আমি চলমান কনসোলটি সনাক্ত করতে এবং এর ফাইলের পাথ পেতে সক্ষম হয়েছি। তবে আমি কনসোলটির প্রস্থ পেতে এই তথ্যটি ব্যবহার করতে লড়াই করছি। আমি কমান্ডটি ব্যবহার করার চেষ্টা করেছি tput, তবে আমি লিনাক্স / স্ক্রিপ্টগুলিতে মোটামুটি নতুন তাই তাই কী করতে হবে তা সত্যিই জানেন না।

এটি করার কারণটি হ'ল আমি ক্রোন এন্ট্রি সেটআপ করতে সক্ষম হতে চাই যা প্রায়শই প্রায়শই এর প্রস্থ / কলামগুলির কনসোলটি সূচিত করে।

এটি এখন পর্যন্ত আমার কোড:

tty.sh

#!/bin/bash

#Get PID of terminal
#terminal.txt holds most recent PID of console in use
value=$(</home/test/Documents/terminal.txt)

#Get tty using the PID from terminal.txt
TERMINAL="$(ps h -p $value -o tty)"
echo $TERMINAL

#Use tty to get full filepath for terminal in use
TERMINALPATH=/dev/$TERMINAL
echo $TERMINALPATH

COLUMNS=$(/home/test/Documents/get_columns.sh)
echo $COLUMNS

get_columns.sh

#!/usr/bin/env bash
echo $(/usr/bin/tput cols)

TERMINAL& TERMINALPATHএর সাধারণ আউটপুট এবং উদাহরণস্বরূপ &pts/terminalnumber/dev/pts/terminalnumberpts/0/dev/pts/0


1
unix.stackexchange.com/questions/16578/… আপনাকে সাহায্য করতে পারে।
পিএইচকে

@ পিএফকে আমি মনে করি না যে এটি সাহায্য করে। সমস্যাটি এখানে কীভাবে কলাম / লাইনের জন্য প্রকৃত মানগুলির tty ড্রাইভারকে বলতে হয়। এটি এখানে tty ড্রাইভার থেকে তাদের নির্ধারণ করা হয়।
রোয়াইমা

আমি মনে করি না যে cronচাকরীর নিয়ন্ত্রণকারী টার্মিনালগুলি রয়েছে।
TMN

উত্তর:


18

tputকমান্ড একটি চমৎকার টুল, কিন্তু দুর্ভাগ্যবশত এটি একটি ইচ্ছামত নির্বাচিত টার্মিনাল জন্য প্রকৃত সেটিংস পুনরুদ্ধার করতে পারবে না।

এর কারণ হ'ল এটি টার্মিনাল বৈশিষ্ট্যগুলির জন্য স্টডআউট পড়ে এবং এটি যেখানে এটির উত্তর লিখেছে। সুতরাং আপনার আউটপুট ক্যাপচার করার মুহুর্তটি tput colsএর তথ্যের উত্সটিও সরিয়ে ফেলেছে।

সৌভাগ্যবসত, sttyসার্চ stdin বদলে stdout- এ , টার্মিনাল বৈশিষ্ট্য তার নির্ধারণের তাই এই কিভাবে আপনি আকার তথ্যের প্রয়োজন তা উদ্ধার করতে পারেন হল:

terminal=/dev/pts/1
columns=$(stty -a <"$terminal" | grep -Po '(?<=columns )\d+')
rows=$(stty -a <"$terminal" | grep -Po '(?<=rows )\d+')

উপায় দ্বারা, এটা অকারণে কষ্টকর হিসাবে এই লেখার এর echo $(/usr/bin/tput cols)

যে কোনও নির্মাণের জন্য echo $(some_command)আপনি চলছে some_commandএবং এর আউটপুট ক্যাপচার করছে যা আপনি তারপরে echoআউটপুটে চলে যাবেন to প্রায় প্রতিটি পরিস্থিতিতে আপনি কল্পনা করতে পারেন আপনি সম্ভবত চালিয়েছেন some_commandএবং এটি সরাসরি তার আউটপুট সরবরাহ করতে দেয়। এটি আরও দক্ষ এবং পড়া সহজ।


কোনটির বাস্তবায়ন / সংস্করণ tput/ nurses? মাইন (স্ট্রাউডে এটি না করতে পারলে স্ট্রারারে TIOCGWINSZ করে মাইন (6.0.201606025)) cols=$(tput cols)বা cols=$(tput cols 2<> /dev/ttyx) ঠিক কাজ করে।
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস আমি 5.9 + 20140913-1 + বি 1 মূলত দেবিয়ান "সিড" থেকে ইনস্টল করেছি। এখনই একটি নতুন সংস্করণ খুঁজছেন।
রোয়াইমা

1
ncurses 5.7.20100313এখানে পাশাপাশি কাজ করে । আপনি কি ইতিবাচক আপনার cols=$(tput cols 2<> /dev/tty1)জন্য কাজ করে না?
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলা আকর্ষণীয়। তুমি ডানে: যদি আমি সরাতে stdout- এ টার্মিন্যাল থেকে দূরে, tput colsথেকে পড়া নেই দ্বারা stderr । আমার উত্তরটি কীভাবে পুনরায় লিখতে হবে সে সম্পর্কে এখন আমার কাজ করা দরকার ...
রোয়াইমা

1
আমি stty size <"$terminal" | read rows columnsপার্স করার চেষ্টা করার পরিবর্তে ব্যবহার করবstty -a
এলোমেলো 832

13

tput colsএবং tput linesতার স্টডআউটের টার্মিনাল ডিভাইস থেকে টার্মিনালের আকারটি (টার্মিনাল ডিভাইস ড্রাইভার থেকে, নিজেই নয় টার্মিনালটি থেকে) জিজ্ঞাসা করুন, এবং stdout যদি স্টাইডার cols=$(tput cols)থেকে পাইপ হয় তবে এটির মতো কোনও টার্মিনাল ডিভাইস যদি না হয় ।

সুতরাং, একটি স্বেচ্ছাসেবী টার্মিনাল ডিভাইস থেকে মানগুলি পুনরুদ্ধার করার জন্য আপনাকে সেই ডিভাইসটির স্টাডারে খুলতে হবে tput:

{ cols=$(tput cols) rows=$(tput lines); } 2< "$TERMINALPATH"

(এখানে কেবল পঠনযোগ্য মোডে খোলার ফলে tputএটির ত্রুটি বার্তাগুলি সেখানে আউটপুট দেয় না)।

বিকল্পভাবে, আপনি ব্যবহার করতে সক্ষম হতে পারে stty sizesttyস্টিডিনে টার্মিনালটি অনুসন্ধান করে:

read rows cols < <(stty size < "$TERMINALPATH")

এগুলির কোনওটিই স্ট্যান্ডার্ড নয় তাই (এবং অনুশীলনে উইল) সমস্ত সিস্টেমে কাজ করতে পারে না। এটি GNU / লিনাক্স সিস্টেমে মোটামুটি বহনযোগ্য হওয়া উচিত।

stty sizeটার্মিনাল আকার জিজ্ঞাসা করার জন্য বা অন্যান্য পদ্ধতির সংযোজনের জন্য পসিক্সের কাছে অনুরোধ করা হয়েছিল তবে আলোচনাটি কোথাও চলছে বলে মনে হয় না।


9

এই লিপি:

#!/bin/bash

echo "The number of columns are $COLUMNS"
echo "The number of lines are $LINES"

আরও কিছু না নিয়ে এখানে কাজ করেছেন .....

আপনি ডেটা দিয়ে পরিবেশ পরিবর্তনশীল কেন সেট করছেন? COLUMNS বাই = $ (/ হোম / পরীক্ষা / ডকুমেন্টস / get_columns.sh)

আপনি কি অন্য স্ক্রিপ্ট বা টিটিটি থেকে কলাম এবং লাইনগুলি পাওয়ার চেষ্টা করছেন? এইটাই কি সেইটা? এখনও আমার জন্য অদ্ভুত কারণ আপনি স্থানীয় স্ক্রিপ্টের জন্য কলাম পরিবেশের পরিবর্তনশীল সেট করছেন ....


এটি কোনও cronনির্দিষ্ট টার্মিনালের জন্য ওপি-র কাজের মধ্যে থাকা মানগুলি পুনরুদ্ধারে সহায়তা করে না ।
রোয়াইমা

1
Ahn? কি? এখন আমি আরও বিভ্রান্ত, ক্রোনজবস স্ক্রিপ্টগুলির প্রস্থ কীভাবে থাকতে পারে ????? এগুলি আসলে টার্মিনালে চালায় না।
লুসিয়ানো এন্ড্রেস মার্টিনি

আমি জানি. cronকাজ তার বৈশিষ্ট্যের জন্ম একটি নির্দিষ্ট টার্মিনাল জিজ্ঞাস্য। (কেন এটি করা দরকার তা আমি পুরোপুরি নিশ্চিত নই, তবে ওপি এটিই চায়))
রোয়াইমা

@ লুসিওআনড্রেসমার্টিনি $ কলম্বস এবং $ লাইনগুলি ব্যাশ ভেরিয়েবল, এটি ড্যাশ এবং
পশিতে

Tks। আমি সত্যিই জানি, তবে আমার স্ক্রিপ্টটি / বিন / বাশের সাথে হ্যাশবাং রয়েছে বলে আমি মনে করি যে এটি ব্যবহার করা উচিত তা আপনার জানা উচিত। আপনি যদি বিনাশ ছাড়াই কিছু ইউনিক্স ব্যবহার করে থাকেন তবে আমার উত্তরটি আপনার পক্ষে নয়।
লুসিয়ানো এন্ড্রেস মার্টিনি

1

আমার উত্তরটি রোয়িমার চেয়ে আলাদা, কারণ এটি গতিশীল। তার / তার উত্তর আপনাকে তৈরির সময় টার্মিনালের আকার দেয়। যদি আপনি উদাহরণস্বরূপ একটি টাইলিং উইন্ডো ম্যানেজার যেমন আই 3 বা বিএসপিউএম ব্যবহার করে থাকেন তবে আপনি টার্মিনালের বর্তমান প্রস্থটি রাখতে চান। এইভাবে আমি কোরিউটিলস প্যাকেজ থেকে স্টেস্টি ব্যবহার করি:

#!/bin/bash
stty size | awk '{print $2}'

লুসিওনের সমাধান এক্সটার্ম এবং এক্সফেস 4-টার্মিনালে নির্দোষ কাজ করে। আমি জানি না যে সমস্ত টার্মিনালগুলি OL COLUMNS ভেরিয়েবল সেট করে।


এটি আমার উত্তরটির পরে আর গতিশীল নয়। উভয়ই আপনাকে কমান্ডগুলি চালানোর সময় টার্মিনাল আকার দেয়।
রোয়াইমা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.