লিনাক্সে স্ট্ডিন, স্টডআউট এবং স্ট্ডার কী?

stdin, stdout, এবং stderr আপনি লিনাক্স কমান্ড চালু করার সময় তৈরি হওয়া তিনটি ডাটা স্ট্রিম। আপনার স্ক্রিপ্টগুলি পাইপ করা হয়েছে বা পুনঃনির্দেশিত হচ্ছে কিনা তা জানাতে আপনি এগুলি ব্যবহার করতে পারেন। আমরা আপনাকে কিভাবে দেখায়।

স্ট্রিম দুটি দফায় যোগ দেয়

আপনি লিনাক্স এবং ইউনিক্স-এর মতো অপারেটিং সিস্টেমগুলি সম্পর্কে শিখতে শুরু করার সাথে সাথে আপনি শর্তগুলি সরিয়ে নিয়ে যাবেন stdin, stdout, এবং stederr। এটি তিনটি স্ট্যান্ডার্ড স্ট্রিম যা একটি লিনাক্স কমান্ড কার্যকর করা হলে প্রতিষ্ঠিত হয়। কম্পিউটিংয়ে, একটি স্ট্রিম এমন একটি জিনিস যা ডেটা স্থানান্তর করতে পারে। এই স্ট্রিমগুলির ক্ষেত্রে, ডেটাটি পাঠ্য।

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

লিনাক্স স্ট্যান্ডার্ড স্ট্রিমস

লিনাক্সে,stdin স্ট্যান্ডার্ড ইনপুট স্ট্রিম। এটি পাঠ্যটিকে এর ইনপুট হিসাবে গ্রহণ করে। কমান্ড থেকে শেলের কাছে পাঠ্য আউটপুট সরবরাহ করা হয় stdout (স্ট্যান্ডার্ড আউট) স্ট্রিম। কমান্ড থেকে ত্রুটি বার্তা প্রেরণ করা হয় stderr (স্ট্যান্ডার্ড ত্রুটি) স্ট্রিম।

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

স্ট্রিমগুলি ফাইলগুলির মতো পরিচালনা করা হয়

লিনাক্সের স্ট্রিমগুলি else প্রায় সমস্ত কিছুর মতো treated ফাইল হিসাবে মনে করা হয়। আপনি একটি ফাইল থেকে পাঠ্য পড়তে পারেন, এবং আপনি একটি ফাইলের মধ্যে পাঠ্য লিখতে পারেন। এই উভয় ক্রিয়া ডেটা একটি স্ট্রিম জড়িত। সুতরাং ফাইল হিসাবে ডেটা স্ট্রিম পরিচালনা করার ধারণাটি এতটা প্রসারিত নয় of

প্রক্রিয়াটির সাথে যুক্ত প্রতিটি ফাইল এটি সনাক্ত করতে একটি অনন্য নম্বর বরাদ্দ করা হয়। এটি ফাইল বর্ণনাকারী হিসাবে পরিচিত। যখনই কোনও ফাইলে কোনও ক্রিয়া সম্পাদনের প্রয়োজন হয়, ফাইল বর্ণনাকারী ফাইলটি সনাক্ত করতে ব্যবহৃত হয়।

এই মানগুলি সর্বদা জন্য ব্যবহৃত হয় stdin, স্টাডআউট, এবং stderr:

  • 0: স্টিডিন
  • 1: stdout
  • 2: stderr

পাইপ এবং পুনঃনির্দেশগুলির প্রতিক্রিয়া

কারও কারও সাথে পরিচয় সহজ করতে, একটি সাধারণ কৌশল হ'ল বিষয়টির সরলিকৃত সংস্করণ শেখানো। উদাহরণস্বরূপ, ব্যাকরণ সহ, আমাদের বলা হয় যে নিয়মটি "সি এর পরে আমি ই এর আগে," তবে প্রকৃতপক্ষে, এই বিধি মেনে চলার ক্ষেত্রে এর চেয়ে বেশি ব্যতিক্রম রয়েছে।

অনুরূপ শিরা মধ্যে, যখন কথা হয় stdin, stdout, এবং stderr এটি স্বীকৃত অক্ষরেখার বাইরে বেরোনোর ​​জন্য সুবিধাজনক যে কোনও প্রক্রিয়া তার তিনটি স্ট্যান্ডার্ড স্ট্রিমগুলি কোথায় বন্ধ করা যায় তা না জানে বা যত্ন করে না। কোনও আউটপুটটি টার্মিনালে চলে যাচ্ছে বা কোনও ফাইলে পুনঃনির্দেশিত হচ্ছে কিনা কোনও প্রক্রিয়াটির যত্ন নেওয়া উচিত? এমনকি কি এটির ইনপুট কিবোর্ড থেকে আসছে বা অন্য কোনও প্রক্রিয়া থেকে পাইপ করা হচ্ছে তাও বলতে পারবেন?

প্রকৃতপক্ষে, কোনও প্রক্রিয়া জানে — বা কমপক্ষে এটি অনুসন্ধান করা উচিত should এবং এটি সফ্টওয়্যার লেখক যদি সেই কার্যকারিতা যুক্ত করার সিদ্ধান্ত নেন তবে এটি সেই অনুযায়ী তার আচরণটি পরিবর্তন করতে পারে does

আচরণের এই পরিবর্তনটি আমরা খুব সহজেই দেখতে পাই। এই দুটি আদেশ ব্যবহার করে দেখুন:

ls

ls | বিড়াল

দ্য ls যদি আউটপুট (কমান্ড) আলাদা আচরণ করেstdout) অন্য কমান্ডে পাইপ করা হচ্ছে। এটাls যেটি একটি একক কলাম আউটপুটে স্যুইচ করে, এটি রূপান্তর করে না performed বিড়াল। এবং ls যদি এর আউটপুট পুনঃনির্দেশিত হয় তবে একই কাজ করে:

ls> ক্যাপচার ডট টেক্সট

বিড়াল ক্যাপচার। txt

পুনঃনির্দেশ stdout এবং stderr

একটি ডেডিকেটেড স্ট্রিম দ্বারা বিতরণ ত্রুটি বার্তা থাকার একটি সুবিধা রয়েছে। এর অর্থ আমরা কোনও কমান্ডের আউটপুট পুনর্নির্দেশ করতে পারি (stdout) একটি ফাইল এবং এখনও ত্রুটি বার্তা দেখুন (stderr) টার্মিনাল উইন্ডোতে। আপনার প্রয়োজন হলে ত্রুটিগুলির প্রতিক্রিয়া জানাতে পারেন, যেমনটি ঘটে থাকে। এটি ত্রুটি বার্তাগুলি ফাইলটিকে দূষিত করা থেকে বিরত রাখে stdout পুনঃনির্দেশ করা হয়েছে।

একটি সম্পাদক এ নিম্নলিখিত পাঠ্য টাইপ করুন এবং এটি ত্রুটি .sh নামক একটি ফাইলে সংরক্ষণ করুন।

#! / বিন / বাশ প্রতিধ্বনি "উপস্থিত নেই এমন একটি ফাইল অ্যাক্সেস করার চেষ্টা করতে চলেছে" বিড়াল খারাপ-ফাইল নাম.txt

এই কমান্ডটি দিয়ে স্ক্রিপ্টটি সম্পাদনযোগ্য করুন:

chmod + x error.sh

স্ক্রিপ্টের প্রথম লাইনটি টার্মিনাল উইন্ডোটিতে পাঠ্য প্রতিধ্বনিত করেstdout প্রবাহ দ্বিতীয় লাইনটি এমন কোনও ফাইল অ্যাক্সেস করার চেষ্টা করে যা অস্তিত্বহীন। এটি এর মাধ্যমে বিতরণ করা একটি ত্রুটি বার্তা উত্পন্ন করবে stderr.

এই কমান্ডটি দিয়ে স্ক্রিপ্টটি চালান:

./error.sh

আমরা দেখতে পাচ্ছি উভয় আউটপুট স্ট্রিম, stdout এবং stderr, টার্মিনাল উইন্ডোতে প্রদর্শিত হয়েছে।

আউটপুটটি কোনও ফাইলে পুনর্নির্দেশ করার চেষ্টা করা যাক:

./error.sh> Caps.txt

এর মাধ্যমে বিতরণ করা ত্রুটি বার্তা stderr এখনও টার্মিনাল উইন্ডোতে প্রেরণ করা হয়। আমরা ফাইলের বিষয়বস্তু পরীক্ষা করে দেখতে পারি যে এটি কিনা stdout আউটপুট ফাইল গিয়েছিলাম।

বিড়াল ক্যাপচার। txt

থেকে আউটপুট stdin প্রত্যাশার মতো ফাইলটিতে পুনর্নির্দেশ করা হয়েছিল।

দ্য > পুনঃনির্দেশ প্রতীক সঙ্গে কাজ করে stdout গতানুগতিক. আপনি কোন স্ট্যান্ডার্ড আউটপুট স্ট্রিমটি পুনঃনির্দেশ করতে চান তা বোঝাতে আপনি একটি সংখ্যক ফাইল বর্ণনাকারী ব্যবহার করতে পারেন।

সুস্পষ্টভাবে পুনঃনির্দেশ করতে stdout, এই পুনঃনির্দেশ নির্দেশ ব্যবহার করুন:

1>

সুস্পষ্টভাবে পুনঃনির্দেশ করতে stderr, এই পুনঃনির্দেশ নির্দেশ ব্যবহার করুন:

2>

আসুন আবার আমাদের পরীক্ষার চেষ্টা করুন, এবং এবার আমরা ব্যবহার করব 2>:

./error.sh 2> ক্যাপচার.টেক্সট

ত্রুটি বার্তা পুনঃনির্দেশিত হয় এবং stdoutপ্রতিধ্বনি টার্মিনাল উইন্ডোতে বার্তা প্রেরণ করা হয়:

ক্যাপচার. টেক্সট ফাইলে কী আছে তা দেখা যাক।

বিড়াল ক্যাপচার। txt

দ্য stderr প্রত্যাশা অনুযায়ী বার্তা ক্যাপচার.টেক্সটে রয়েছে।

Stdout এবং stderr উভয়ই পুনর্নির্দেশ করা হচ্ছে

অবশ্যই, আমরা যদি পুনর্নির্দেশ করতে পারেন stdout বা stderr একে অপরের থেকে পৃথক পৃথক একটি ফাইলের, আমাদের দুটি একই সাথে দুটি ভিন্ন ফাইলগুলিতে পুনর্নির্দেশ করতে সক্ষম হওয়া উচিত?

হ্যাঁ আমরা পারি. এই কমান্ড নির্দেশ দেবে stdout ক্যাপচার.টেক্সট এবং stderr ত্রুটি .txt নামে পরিচিত একটি ফাইলে।

./error.sh 1> Caps.txt 2> error.txt

কারণ আউটপুট – স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড ত্রুটি both উভয় স্ট্রিম ফাইলগুলিতে পুনঃনির্দেশিত হয়েছে, টার্মিনাল উইন্ডোতে কোনও দৃশ্যমান আউটপুট নেই। আমরা কমান্ড লাইন প্রম্পটে ফিরে এসেছি যেন কিছুই ঘটেনি।

প্রতিটি ফাইলের বিষয়বস্তু যাচাই করা যাক:

বিড়াল ক্যাপচার। txt
বিড়াল ত্রুটি। txt

একই ফাইলে stdout এবং stderr পুনর্নির্দেশ

এটি ঝরঝরে, আমরা প্রতিটি স্ট্যান্ডার্ড আউটপুট স্ট্রিমের নিজস্ব ডেডিকেটেড ফাইলটিতে যাচ্ছি। কেবলমাত্র অন্য সংমিশ্রণটিই আমরা উভয়কেই প্রেরণ করতে পারি stdout এবং stderr একই ফাইল।

আমরা নিম্নলিখিত কমান্ড দিয়ে এটি অর্জন করতে পারি:

./error.sh> Caps.txt 2> & 1 &

এটি ভেঙে দেওয়া যাক।

  • ./error.sh: ত্রুটি.শ স্ক্রিপ্ট ফাইলটি চালু করে।
  • > ক্যাপচার.টেক্সট: পুনঃনির্দেশ stdout ক্যাপচার.টেক্সট ফাইলটিতে প্রবাহ করুন। > সংক্ষিপ্ত 1>.
  • 2>&1: এটি &> পুনর্নির্দেশ নির্দেশ ব্যবহার করে। এই নির্দেশিকা আপনাকে শেলটিকে একটি স্ট্রিমটিকে অন্য স্ট্রিমের মতো একই গন্তব্যে পৌঁছে দিতে বলার অনুমতি দেয়। এই ক্ষেত্রে, আমরা বলছি "স্ট্রিম 2 পুনর্নির্দেশ, stderr, একই গন্তব্য যে 1 স্ট্রিম, stdout, এ পুনঃনির্দেশিত করা হচ্ছে ”"

কোনও দৃশ্যমান আউটপুট নেই। এটা উত্সাহজনক।

আসুন ক্যাপচার.টিএসটি ফাইলটি যাচাই করে দেখুন এটিতে কী রয়েছে।

বিড়াল ক্যাপচার। txt

উভয় stdout এবং stderr স্ট্রিমগুলি একটি একক গন্তব্য ফাইলে পুনঃনির্দেশ করা হয়েছে।

কোনও স্ট্রিমের আউটপুট পুনঃনির্দেশিত এবং নীরবে নিক্ষেপ করতে, আউটপুটটি এতে সরাসরি করুন / দেব / নাল.

একটি স্ক্রিপ্টের মধ্যে পুনঃনির্দেশ সনাক্ত করা

আমরা আলোচনা করেছি যে কোনও কমান্ড কীভাবে স্ট্রিমগুলির কোনও পুনঃনির্দেশিত হচ্ছে কিনা তা সনাক্ত করতে পারে এবং সে অনুযায়ী তার আচরণ পরিবর্তন করতে বেছে নিতে পারে। আমরা কি আমাদের নিজস্ব লিপিগুলিতে এটি সম্পাদন করতে পারি? হ্যাঁ আমরা পারি. এবং এটি বোঝার এবং নিযুক্ত করার জন্য খুব সহজ কৌশল।

একটি সম্পাদক এ নিম্নলিখিত পাঠ্য টাইপ করুন এবং ইনপুট.শ হিসাবে সংরক্ষণ করুন।

#! / বিন / বাশ যদি [-t 0]; এরপরে ইকো স্ট্ডিন কীবোর্ড থেকে আসে অন্যথায় ইকো স্ট্ডিন পাইপ বা ফাইল ফাই থেকে আসে

এটি কার্যকর করার জন্য নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

chmod + x ইনপুট.শ

চৌকস অংশটি বর্গাকার বন্ধনীগুলির মধ্যে পরীক্ষা। দ্য -t (টার্মিনাল) বিকল্পটি সত্য (0) ফেরায় যদি ফাইল বর্ণনাকারীর সাথে যুক্ত ফাইলটি টার্মিনাল উইন্ডোতে শেষ হয়। আমরা পরীক্ষার যুক্তি হিসাবে ফাইল বর্ণনাকারী 0 ব্যবহার করেছি, যা প্রতিনিধিত্ব করেstdin.

যদি stdin টার্মিনাল উইন্ডোতে সংযুক্ত থাকলে পরীক্ষাটি সত্য প্রমাণিত হবে। যদি stdin কোনও ফাইল বা পাইপের সাথে সংযুক্ত রয়েছে, পরীক্ষাটি ব্যর্থ হবে।

স্ক্রিপ্টে ইনপুট তৈরি করতে আমরা কোনও সুবিধাজনক পাঠ্য ফাইল ব্যবহার করতে পারি। এখানে আমরা ডমি.টিএসটিএস্ট নামে একটি ব্যবহার করছি।

./input.sh <dummy.txt

আউটপুট দেখায় যে স্ক্রিপ্টটি স্বীকৃতি দিয়েছে যে ইনপুটটি কোনও কীবোর্ড থেকে আসছে না, এটি একটি ফাইল থেকে আসছে। যদি আপনি এটি চয়ন করে থাকেন তবে আপনি সেই অনুযায়ী আপনার স্ক্রিপ্টের আচরণকে পৃথক করতে পারেন।

এটি একটি ফাইল পুনঃনির্দেশের সাথে ছিল, আসুন এটি একটি পাইপ দিয়ে চেষ্টা করুন।

বিড়াল dummy.txt | ./input.sh

স্ক্রিপ্টটি স্বীকৃতি দেয় যে এর ইনপুটটি এটিতে পাইপ করা হচ্ছে। বা আরও স্পষ্টভাবে, এটি আরও একবার স্বীকৃতি দেয় যে stdin স্ট্রিম একটি টার্মিনাল উইন্ডোতে সংযুক্ত নয়।

পাইপ বা পুনঃনির্দেশগুলি না দিয়ে স্ক্রিপ্টটি চালিত করি।

./input.sh

দ্য stdin স্ট্রিমটি টার্মিনাল উইন্ডোতে সংযুক্ত এবং স্ক্রিপ্টটি সেই অনুযায়ী প্রতিবেদন করে।

আউটপুট স্ট্রিমের সাথে একই জিনিসটি পরীক্ষা করতে, আমাদের একটি নতুন স্ক্রিপ্ট দরকার। একটি সম্পাদক এ নিম্নলিখিত টাইপ করুন এবং আউটপুট.শ হিসাবে সংরক্ষণ করুন।

#! / বিন / বাশ যদি [-t 1]; তারপরে ইকো স্টডআউট টার্মিনাল উইন্ডোতে চলেছে অন্যথায় ইকো স্টডআউট পুনঃনির্দেশিত হচ্ছে বা পাইপযুক্ত ফাই হচ্ছে

এটি কার্যকর করার জন্য নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

chmod + x ইনপুট.শ

এই স্ক্রিপ্টের একমাত্র উল্লেখযোগ্য পরিবর্তন বর্গাকার বন্ধনীর পরীক্ষায়। আমরা ফাইলের জন্য বর্ণনাকারী উপস্থাপন করতে 1 সংখ্যাটি ব্যবহার করছি stdout.

এর চেষ্টা করে দেখুন। আমরা আউটপুটটি পাইপ করব বিড়াল.

./ আউটপুট | বিড়াল

স্ক্রিপ্টটি স্বীকৃতি দেয় যে এর আউটপুট সরাসরি টার্মিনাল উইন্ডোতে যাচ্ছে না।

আউটপুটটিকে কোনও ফাইলে পুনর্নির্দেশ করে আমরা স্ক্রিপ্টটিও পরীক্ষা করতে পারি।

। / আউটপুট.শ> ক্যাপচার.টেক্সট

টার্মিনাল উইন্ডোতে কোনও আউটপুট নেই, আমরা নিঃশব্দে কমান্ড প্রম্পটে ফিরে আসছি। যেমনটি আমরা আশা করতাম।

কী ক্যাপচার হয়েছে তা দেখতে আমরা ক্যাপচার.টিএসটি ফাইলের ভিতরে দেখতে পারি। এটি করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন।

বিড়াল ক্যাপচার

আবার, আমাদের স্ক্রিপ্টের সহজ পরীক্ষাটি এটি সনাক্ত করে stdout স্ট্রিম সরাসরি টার্মিনাল উইন্ডোতে প্রেরণ করা হচ্ছে না।

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

./output.sh

এবং এটিই আমরা দেখতে পাই।

চেতনা স্ট্রিমস

আপনার স্ক্রিপ্টগুলি টার্মিনাল উইন্ডোতে বা কোনও পাইপের সাথে সংযুক্ত রয়েছে বা পুনঃনির্দেশিত হচ্ছে কিনা তা কীভাবে জানাবেন তা আপনাকে সেই অনুযায়ী তাদের আচরণটি সামঞ্জস্য করতে দেয়।

লগিং এবং ডায়াগনস্টিক আউটপুট আরও বা কম বিশদ হতে পারে, এটি স্ক্রিনে বা কোনও ফাইলে যাচ্ছে কিনা তার উপর নির্ভর করে। ত্রুটি বার্তাগুলি সাধারণ প্রোগ্রাম আউটপুটের চেয়ে আলাদা ফাইলে লগ করা যায়।

যেমনটি সাধারণত হয়, আরও জ্ঞান আরও বিকল্প নিয়ে আসে।