আমার শেলটি টার্মিনালে চলছে কিনা তা আমি কীভাবে পরীক্ষা করব?


22

আমার শেলটি যদি কোনও টার্মিনালের সাথে "সংযুক্ত" থাকে তবেই আমি কিছু ক্রিয়া সম্পাদন করতে চাই, কেবলমাত্র যদি আমার স্ট্যান্ডার্ড ইনপুটটি টার্মিনালের ইনপুট থেকে আসে এবং আমার স্ট্যান্ডার্ড আউটপুট (এবং স্ট্যান্ডার্ড ত্রুটি? এটি মুখ্য নয়) তবে মুদ্রিত / প্রতিধ্বনিত হয় একটি টার্মিনাল

/proc/selfসরাসরি জিএনইউ / লিনাক্সের বিবরণ (যেমন ) এর উপর নির্ভর না করে আমি কীভাবে এটি করতে পারি ?


উত্তর:


33

isattyএটি যাচাই করার জন্য একটি ফাংশন এবং কমান্ডের -tপতাকা এটিtest শেল স্ক্রিপ্ট থেকে অ্যাক্সেসযোগ্য করে তোলে:

-t file_descriptor

যদি ফাইল বর্ণনাকারীর নাম্বার file_descriptor খোলা থাকে এবং টার্মিনালের সাথে যুক্ত থাকে তবে সত্য । যদি ফাইল_ডেস্ক্রিপ্টর একটি বৈধ ফাইল বর্ণনাকারী নম্বর না হয়, বা যদি ফাইল বর্ণনাকারী ফাইল ফাইল_ডেস্ক্রিপ্টার খোলা থাকে না, বা যদি এটি খোলা থাকে তবে টার্মিনালের সাথে সম্পর্কিত না হয় তবে মিথ্যা ।

আপনি এফডি 0 (স্ট্যান্ডার্ড ইনপুট) টিটিওয়াই কিনা তা পরীক্ষা করতে পারেন:

test -t 0

আউটপুট এবং ত্রুটি স্ট্রিমগুলি পরীক্ষা করতে এবং এগুলির সমস্ত পরীক্ষা করতে আপনি এফডি 1 এবং 2 এর জন্য একই কাজ করতে পারেন:

test -t 0 -a -t 1 -a -t 2

বর্ণনাকারীদের একটি টার্মিনাল পর্যন্ত আবদ্ধ করা হয় এবং অন্যথায় মিথ্যা হলে কমান্ডটি 0 (সফল হয়) দেয়।

test["বন্ধনী পরীক্ষার" জন্য কমান্ড হিসাবে উপলব্ধ :

 if [ -t 0 ] ; then ...

শর্তসাপেক্ষে লিখতে এটি একটি মূ .় উপায়।


8

আমি ধারণা করি এটি একটি সদৃশ, তবে আমি এটি খুঁজে পাচ্ছি না। ব্যবহার

[ -t 0 ]

এবং

[ -t 1 ]

স্ট্যান্ডার্ড ইনপুট এবং আউটপুট কোনও টার্মিনালের সাথে সংযুক্ত কিনা তা যথাক্রমে পরীক্ষা করতে। man testবিস্তারিত আছে।


7

ইতিমধ্যে জরিমানা জবাব দেওয়া হয়েছে তার উপরে কেবল একটি অতিরিক্ত নোট। নোট করুন যে [ -t 0 ]ফাইল বর্ণনাকারী 0 টি পরীক্ষা করে এমন একটি ফাইল খোলে যে টিটি লাইনের শৃঙ্খলাযুক্ত একটি ডিভাইস ফাইল (সাধারণত, এটি নিরপেক্ষ টার্মিও (গুলি) ioctl () সফল হয় তা পরীক্ষা করেই সম্পন্ন হয়েছে)।

এছাড়াও, এর অর্থ এই নয় যে অন্য প্রান্তে একটি টার্মিনাল বা টার্মিনাল এমুলেটর রয়েছে (একটি কীবোর্ডে প্রকৃত ব্যবহারকারী টাইপ সহ) (যদিও প্রচুর সংখ্যাগরিষ্ঠ ক্ষেত্রে এবং সম্ভবত আপনি বেশিরভাগ ক্ষেত্রেই যত্নবান হন, এটি যথেষ্ট ভাল পড়তা)।

tty এবং pty ডিভাইসগুলি ডেটা স্থানান্তর করার জন্য বা একটি আন্তঃক্রিয়া যোগাযোগ ব্যবস্থা হিসাবে ব্যবহার করা যেতে পারে।

উদাহরণস্বরূপ, কেউ এটি করতে পারে:

(stty raw -echo; myscript) < /dev/ttyS0

আরএস 232 এর থেকে কী প্রাপ্ত হয়েছে তা খাওয়ানোর জন্য myscript

echo test | ssh -tt host myscript

হবে myscriptএর stdin একটি Pty ডিভাইস হচ্ছে না (এর সাথে sshdঅন্য প্রান্তে, এবং শেষ পর্যন্ত (SSH সংযোগ জুড়ে) না টার্মিনাল, কিন্তু একটি নল দ্বারা প্রতিপালিতecho )

সেই আরএস 232 লাইন বা পিটিটির অন্য প্রান্তে টার্মিনাল রয়েছে কিনা তা পরীক্ষা করতে আপনি কোনও $TERMভেরিয়েবল সেট এবং খালি নয় ( [ -n "$TERM" ]) খতিয়ে দেখতে পারেন এবং ডিভাইস স্ট্যাটাস রিপোর্টটি এফডি-র উপরের এস্কেপ ক্রম প্রেরণ করতে পারেন এবং আপনি যে চেক পেয়েছেন তা পরীক্ষা করতে পারেন একটি প্রতিক্রিয়া (ছাড়াও [ -t 0 ]এবং [ -n "$TERM" ])।

printf >&0 '\e[5n'

\e[0nবেশিরভাগ টার্মিনাল দ্বারা একটি দ্বারা জবাব দেওয়া হয় ।

এখন এটি নিয়ে বেশ কয়েকটি সমস্যা রয়েছে, তাই আপনি যা যাচাই করতে চান সেই ক্ষেত্রে ব্যতীত আমি তা করার পরামর্শ দেব না কারণ আপনি একটি ভিজ্যুয়াল টিউআই অ্যাপ্লিকেশন চালাতে চান (এই ক্ষেত্রে, আপনি লাইব্রেরি ব্যবহার করে আরও ভাল থাকবেন ncurses, এবং ডিএসআরের পরিবর্তে, আপনি টার্মিনালের ধরণটি আরও বিশদভাবে অনুসন্ধানের জন্য ডিভাইস সনাক্তকরণের পালানোর ক্রমটি প্রেরণ করতে চান $TERM):

  • ধন্যবাদ, বেশিরভাগ ক্ষেত্রে যেখানে স্টিডিন কোনও টার্মিনাল নয়, এটি কেবল পঠনযোগ্য মোডে খোলা থাকবে যার ফলে এটি printfব্যর্থ হতে পারে, তবে স্টিডিন যদি রিড + রাইট মোডে একটি টিটি ডিভাইস খোলা থাকে তবে এর পার্শ্ব প্রতিক্রিয়া হবে অন্য প্রান্তে যে ক্রম প্রেরণ। উদাহরণস্বরূপ উপরে আমাদের ssh উদাহরণে উদাহরণস্বরূপ, এটি প্রকৃতপক্ষে একটি টার্মিনালে ক্রম প্রেরণ করবে (তবে উত্তরটি স্টিডিনে আসবে না)
  • উত্তরটি নির্ভরযোগ্যভাবে এবং বহনযোগ্যভাবে পড়া খুব কঠিন। আপনার অস্থায়ীভাবে টিটি লাইনের শৃঙ্খলা পরিবর্তন করতে হবে এবং একবারে একটি বাইট পড়তে হবে। আপনাকে একটি সময়সীমাও স্থির করতে হবে যার মাধ্যমে উত্তরটি যদি না দেখা যায়, আপনি হাল ছেড়ে দিয়ে সিদ্ধান্ত নেবেন যে কোনও টার্মিনাল নেই। আপনি যদি উপগ্রহ সংযোগগুলির মাধ্যমে লোকেরা ডায়াল করতে বিবেচনা করতে চান তবে এর অর্থ একটি দীর্ঘ সময়সীমা।
  • পটভূমিতে যখন কোনও টার্মিনাল থেকে পড়া আপনার স্ক্রিপ্টকে একটি সাইনটিন সংকেত দিয়ে স্থগিত করে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.