এই দুটি 'বিড়াল' কমান্ডের ফলাফল আলাদাভাবে হয় কেন?


12

আসুন ধরে নেওয়া যাক infile একটি নির্দিষ্ট পাঠ্য রয়েছে এবং আমি নিম্নলিখিত কমান্ডগুলির সেটটি সম্পাদন করব:

Exec 3<infile

বিড়াল -n <&3

বিড়াল -n <&3

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

উত্তর:


29

তারা একই কমান্ডের মতো দেখায় তবে তাদের পার্থক্যের কারণ হ'ল প্রথম কমান্ডের ফলে সিস্টেমের অবস্থা পরিবর্তন হয়েছে। বিশেষত, প্রথমটি catপুরো ফাইলটি গ্রাস করে, তাই দ্বিতীয়টিতে catপড়ার মতো কিছুই থাকে না, সঙ্গে সঙ্গে ইওএফকে (ফাইলের শেষের দিকে) আঘাত করে এবং প্রস্থান করে।

এর পিছনে কারণ হ'ল আপনি উভয়ের অনুরোধের জন্য হুবহু একই ফাইলের বিবরণটি (যা আপনি তৈরি করেছেন exec < infileএবং ফাইল বর্ণনাকারীর সাথে অর্পণ করেছেন 3) ব্যবহার করছেন cat। ওপেন ফাইলের বর্ণনার সাথে জড়িত একটি জিনিস হ'ল ফাইল অফসেট। সুতরাং, প্রথমটি catপুরো ফাইলটি পড়ে, শেষের দিকে অফসেটটি ছেড়ে দেয় এবং দ্বিতীয়টি ফাইলটির শেষে থেকে বাছাই করার চেষ্টা করে এবং পড়ার মতো কিছুই খুঁজে পায় না।


12

@ Jw013 এর উত্তম উত্তর যুক্ত করতে, এটি বুঝতে পারার পক্ষে এটি একইরকম

{
   cat -n
   cat -n
} < infile

< fileসংক্ষিপ্ত হওয়ার কারণে 0< fileএটি 3 এর পরিবর্তে 0 ফাইল বর্ণনাকারী 0 ব্যবহার করে।

এবং এই বিষয়টিটিকে সামান্য বিভ্রান্ত করার জন্য: এই সংস্করণ:

exec 3< infile
cat -n /dev/fd/3
cat -n /dev/fd/3

আচরণ করবে ভিন্নভাবে ওএস আপনি এটি চালানোর উপর নির্ভর করে টাইপ এর infile(নল ডিভাইস বনাম বনাম নিয়মিত ফাইল ...)

সোলারিস এবং বেশিরভাগ বাণিজ্যিক ইউনিটগুলিতে, একটি open("/dev/fd/3")কম-বেশি সমান dup(3)( < /dev/fd/3যেমন একই রকম হয় <&3), লিনাক্সে নিয়মিত ফাইলের জন্য /dev/fd/3মূল ফাইলে একটি সিমিলিংক হিসাবে প্রয়োগ করা হয়, সুতরাং open("/dev/fd/3")এটি শুরু থেকে নতুন করে খোলে ( এবং সম্ভবত এফডি 3 থেকে পৃথক পতাকা সহ)।

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