কীভাবে (এবং কেন) উভয়ই পড়া এবং লেখার জন্য স্ট্যাডার ব্যবহার করবেন?


12

দক্ষতার দ্বারা এই উত্তর অনুসারে , স্ট্যান্ডারless থেকে নেভিগেশন কমান্ডগুলি পড়তে পারে যদি এটি খুলতে সক্ষম না হয় /dev/tty

এটি বিস্ময়কর বলে মনে হচ্ছে, যেহেতু আমি কখনই অন্য কোনও প্রোগ্রামের স্ট্রিম স্ট্রিমটিতে কিছু লিখতে দেখিনি, এবং আমি জানি না যে আমি কীভাবে এটি সম্পাদন করব।

স্টাডার উভয়ই পড়া এবং লেখার জন্য উন্মুক্ত হওয়ার উদ্দেশ্য কী? এবং যদি এটি দরকারী হয় তবে আমি কীভাবে এটি আধুনিক সিস্টেমে ব্যবহার করব? (উদাহরণস্বরূপ, স্ট্ডিনের পরিবর্তে স্ট্যাডারের মধ্যে কোনও কিছু পাইপ করার জন্য কি কিছু আরকেন সিনট্যাক্স রয়েছে?)

উত্তর:


7

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

পুনর্নির্দেশের আগে স্টিডিন, স্টডআউট এবং স্ট্ডার একই ডিভাইসে সংযুক্ত হিসাবে প্রত্যাশিত।

#ctrl-alt-delor:~$
#↳ ll /dev/std*
lrwxrwxrwx 1 root root 15 Jun  3 20:58 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Jun  3 20:58 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Jun  3 20:58 /dev/stdout -> /proc/self/fd/1

#ctrl-alt-delor:~$
#↳ ll /proc/self/fd/*
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/0 -> /dev/pts/12
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/1 -> /dev/pts/12
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/2 -> /dev/pts/12

অতএব সর্বাধিক পুনঃনির্দেশের পরে (এটি যদি স্ট্ডার হয়) পুনঃনির্দেশিত হয় না। stderr এখনও টার্মিনালের সাথে সংযুক্ত। সুতরাং এটি পড়তে পারে, কীবোর্ড ইনপুট পেতে।

অপ্রত্যাশিত দিকনির্দেশে ফাইলগুলি ব্যবহার করা বন্ধ করা হচ্ছে কেবলমাত্র কনভেনশন এবং পাইপগুলি একমুখী।

আরেকটি উদাহরণ, চেষ্টা করুন:

cat | less

এটি কোনও পৃষ্ঠার পরে ভুল হয়ে যায়, যখন lessটার্মিনালটি পড়ার চেষ্টা করে ( catএটি টার্মিনালটি পড়ার সাথে সাথে বিস্মিত হয় না )।

/dev/ttyএটি আরও রহস্যজনক, এটির কোনও লিঙ্ক নয় /proc/self

#ctrl-alt-delor:~$
#↳ ll /dev/tty
crw-rw-rw- 1 root tty 5, 0 Jun 29 09:18 /dev/tty

আমার বর্তমান নিয়ন্ত্রণকারী টার্মিনাল এবং `/ dev / tty` এর মধ্যে কী সম্পর্ক রয়েছে তা দেখুন ? একটি ব্যাখ্যা জন্য। লিঙ্কটির জন্য @ স্টেফেনকিটকে ধন্যবাদ।



6

আপনি যখন, stdin, stdout- এ লগ ইন করুন এবং দ্বারা stderr যেখানে আপনি লগ ইন থেকে টার্মিনালে সংযুক্ত। আরো সঠিক হতে, TTY typcally খুলে stdout- এ এবং দ্বারা stderr দুই থেকে ফলে হয় dup(2)প্রথম ফাইলটি বর্ণনাকারী উপর অপারেশন। টার্মিনাল থেকে ইনপুট পাওয়ার জন্য এটি স্টডার থেকে পড়তে দেয়।

অন্য উত্তরে উল্লিখিত হিসাবে, প্রোগ্রামগুলিতে একটি প্রশ্নের ইন্টারেক্টিভ উত্তর পাওয়ার জন্য স্ট্যাডার থেকে পড়া

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

মনে রাখবেন যে আজকের প্রোগ্রামগুলি প্রথমে /dev/ttyস্টার্ডারটি কেবল কাজ না করে সেক্ষেত্রে খোলার এবং ব্যবহার করার চেষ্টা করে।

কেবল স্টাডার থেকে পড়া প্রোগ্রামগুলি সাধারণত 1979 এর আগে আর কখনও সংশোধিত হয়নি এবং এই জাতীয় প্রোগ্রামগুলিতে সাধারণত কন্সট্রাক্ট থাকে:

int i 1;

অথবা

i =* 2;

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


সুতরাং যদি আমি সঠিকভাবে বুঝতে পারি, তবে শেলটি stderrটিটিটির সাথে সংযুক্ত হয় যখন stdinপুনঃনির্দেশিত হয় (পাইপ বা অন্য উপায়ে)? বা শুধু সবসময় stderrtty সাথে সংযুক্ত ?
ড্রাকনিস

1
আপনি লগ ইন করার সময়, স্টডার আপনার লগইন টার্মিনালের সাথে সংযুক্ত থাকে।
সুন্দরভাবে

2
i =+ 1পুরোপুরি বৈধ সি, এবং সমান i = (+1)। মঞ্জুর, প্রাক্তন হ'ল সি প্রতিযোগিতার জন্য ভাল প্রার্থী।
জি স্লাইপেন

1
ঠিক আছে, এটি হতে পারে যে এটি কেবল একটি সতর্কতা তৈরি করে। আমি 1977 সালে C থেকে অন্য কিছু কোড পরিবর্তিত
schily

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