"রিডাইরেক্টস" এবং "পাইপ" দিয়ে আসলে কী চলছে সে সম্পর্কে যদি আপনি চিন্তা করেন তবে বিষয়গুলিকে কল্পনা করা অনেক সহজ। বাশে পুনর্নির্দেশগুলি এবং পাইপগুলি একটি কাজ করে: প্রক্রিয়া ফাইলের বর্ণনাকারী 0, 1 এবং 2 পয়েন্ট যেখানে (দেখুন / প্রোক / [পিআইডি] / এফডি / *) দেখুন সেখানে পরিবর্তন করুন।
যখন পাইপ বা "|" কমান্ড লাইনে অপারেটর উপস্থিত থাকে, প্রথমটি হ'ল বাশ একটি ফিফো তৈরি করে এবং বাম দিকের কমান্ডের এফডি 1টিকে এই ফিফোর দিকে নির্দেশ করে এবং ডান পাশের কমান্ডের এফডি 0টিকে একই ফিফোর দিকে নির্দেশ করে।
এরপরে, প্রতিটি পক্ষের পুনঃনির্দেশ অপারেটরগুলি বাম থেকে ডানে মূল্যায়ন করা হয় এবং যখনই বিবরণীর ডুপ্লিকেশন ঘটে তখন বর্তমান সেটিংস ব্যবহার করা হয়। এটি গুরুত্বপূর্ণ কারণ যেহেতু পাইপটি প্রথমে স্থাপন করা হয়েছিল, এফডি 1 (বাম দিক) এবং এফডি0 (ডান দিকের) ইতিমধ্যে তারা সাধারণত যা ছিল তার থেকে পরিবর্তিত হয়েছে এবং এর কোনও সদৃশই সেই সত্যটি প্রতিফলিত করবে।
অতএব, যখন আপনি নীচের মতো কিছু টাইপ করুন:
command 2>&1 >/dev/null | grep 'something'
ক্রমানুসারে যা ঘটে তা এখানে:
- একটি পাইপ (ফিফো) তৈরি করা হয়। "কমান্ড এফডি 1" এই পাইপের দিকে নির্দেশিত। "গ্রেপ এফডি0" এছাড়াও এই পাইপের দিকে নির্দেশিত
- "কমান্ড এফডি 2" এখানে নির্দেশিত যেখানে "কমান্ড এফডি 1" বর্তমানে নির্দেশিত (পাইপ)
- "কমান্ড এফডি 1" / dev / নাল দ্বারা নির্দেশিত
সুতরাং, "কমান্ড" তার FD 2 (stderr) এ যে সমস্ত আউটপুট লিখেছেন তা পাইপের দিকে এগিয়ে যায় এবং অন্যদিকে "গ্রেপ" দ্বারা পড়ে is "কমান্ড" তার FD 1 (stdout) এ যে সমস্ত আউটপুট লিখেছে সেগুলি তার / dev / নাল পর্যন্ত চলে।
পরিবর্তে, আপনি নিম্নলিখিত চালান:
command >/dev/null 2>&1 | grep 'something'
যা ঘটে তা এখানে:
- একটি পাইপ তৈরি হয় এবং "কমান্ড এফডি 1" এবং "গ্রেপ এফডি 0" এটিতে নির্দেশিত হয়
- "কমান্ড এফডি 1" / dev / নাল দ্বারা নির্দেশিত
- "FD 2 কমান্ড" নির্দেশিত যেখানে এফডি 1 বর্তমানে পয়েন্ট করে (/ dev / নাল)
সুতরাং, "কমান্ড" থেকে সমস্ত stdout এবং stderr / dev / null এ যান। পাইপে কিছুই যায় না, এবং এইভাবে স্ক্রিনে কিছু না দেখিয়ে "গ্রেপ" বন্ধ হয়ে যায়।
এছাড়াও নোট করুন যে পুনঃনির্দেশগুলি (ফাইল বর্ণনাকারী) কেবল পঠনযোগ্য (<), কেবল লেখার জন্য (>), বা পঠন-লিখন (<>) হতে পারে।
একটি চূড়ান্ত নোট। কোনও প্রোগ্রাম এফডি 1 বা এফডি 2 তে কিছু লিখেছে কিনা তা পুরোপুরি প্রোগ্রামারের উপর নির্ভর করে। ভাল প্রোগ্রামিং অনুশীলন নির্দেশ করে যে ত্রুটি বার্তাগুলি এফডি 2 এবং সাধারণ আউটপুট এফডি 1 এ যেতে হবে, তবে আপনি প্রায়শই স্লোপি প্রোগ্রামিং পাবেন যা দুটিতে মিশ্রিত হয় বা অন্যথায় কনভেনশনটিকে উপেক্ষা করে।