একটি ফাইল বর্ণনাকারীর জীবনকাল কি?


11

এখানে বর্ণিত হিসাবে , পুনর্নির্দেশগুলি open()কোনও ফাইলে লিখতে ব্যবহার করে। শেলের মধ্যে একটি অভ্যন্তরীণ (?) ফাইল বর্ণনাকারী তৈরি করা হয়েছে, এবং তারপরে প্রয়োজনে ব্যবহার করা হবে।

স্ক্রিপ্টের পুরো সময়কাল বা শেলের আজীবনের জন্য কি অভ্যন্তরীণ বর্ণনাকারী তৈরি করা হয়েছে? এটি কিছু সময়ের পরে, বেশ কয়েকটি অপারেশন ইত্যাদি ধ্বংস হয়ে যায়?

আমি বলতে চাইছি যে ফাইলগুলি শেল নিজেই তার বিল্টিনগুলির ক্রিয়াকলাপের জন্য খোলে for বিবরণকারী তৈরি এবং ফাইল প্রতিটি অপারেশনের জন্য খোলা আছে? কতক্ষণ তাদের রাখা হয়? উদাহরণ:

#!/bin/bash
>>x echo something
...do many other things not related to the file x
>>x echo something more

প্রথম বর্ণনাকারী উদাহরণটি দ্বিতীয় অপারেশন পর্যন্ত রাখা হয়?

টার্মিনালে আমি যে শেলটি ব্যবহার করি সে সম্পর্কে কী বলা যায়? আমি মাঝে মাঝে একটি অধিবেশন কয়েক দিনের জন্য খোলা রাখি, সম্ভবত কয়েক সপ্তাহ এমনকি। এটি শেল বিল্ট-ইনগুলির সাহায্যে চালিত সমস্ত ফাইলের জন্য কী এখনও বিবরণী রাখে?

উত্তর:


4

সংক্ষেপে: কমান্ডটি সম্পূর্ণ হওয়ার সাথে সাথে একটি শেল পুনর্নির্দেশ সম্পর্কিত ফাইল বর্ণনাকারীদের প্রায় বন্ধ করে দেবে।


বিশদ: পসিক্সে পুনর্নির্দেশের মাধ্যমে খোলা ফাইলগুলি বন্ধ করার কোনও সুস্পষ্ট উল্লেখ নেই (যতদূর আমি দেখতে পাচ্ছি)। তবে তাদের অবিলম্বে বন্ধ না করা খুব কার্যকর হবে না।

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

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

উদাহরণস্বরূপ, প্রথমটির জন্য খোলার এফডিটি প্রথমে echoখোলা রাখা হয় এবং দ্বিতীয়টির জন্য যেমন ব্যবহার করা হয় তবে এটি সঠিকভাবে আচরণ করবে না :

echo foo >> x; mv x y; echo bar >> x

বহিরাগত প্রোগ্রাম শুরু করার জন্য ব্যবহৃত সাধারণ কাঁটাচামচ + এক্সিকিউটি মডেল কমান্ডটি প্রস্থান করার সাথে সাথে ফাইলগুলি স্বয়ংক্রিয়ভাবে বন্ধ করা খুব সহজ করে তোলে। শেলটি কেবল fork()প্রথমে প্রয়োজন, এবং শিশু প্রসেসে প্রয়োজনীয় ফাইলগুলি খোলার আগে exec()প্রকৃত আদেশের পরিবর্তে কল করা উচিত। যখন শিশু প্রক্রিয়াটি প্রস্থান করে, এর দ্বারা খোলা কোনও ফাইল স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়।


ইনawk , যদিও, আউটপুট পুনঃনির্দেশনার সিনট্যাক্স শেল অনুরূপ, কিন্তু কোনো খোলা ফাইল স্ক্রিপ্ট প্রস্থানের পর্যন্ত খোলা রাখা হয়, যদি না স্পষ্টভাবে বন্ধ করে দেয়। এটি কেবল fooএকবার খুলবে এবং প্রিন্টগুলির মধ্যে এটি কেটে যাবে না:

awk 'BEGIN { print "a" > "foo"; print "b" > "foo" }'

6

এগুলি শেষ হয়ে গেলে তারা বন্ধ থাকে। শেলটি চালিত প্রতিটি কমান্ডের জন্য 3 ফাইল বর্ণনাকারী 0,1,2 তৈরি করবে। এগুলি কেবল সংখ্যা, সংখ্যাগুলি পুনরায় ব্যবহৃত হয়েছে। শেল বর্ণনাকারীদের পুনরায় ব্যবহারের আগে ফাইলগুলি বন্ধ করে দেবে।

ফাইল বর্ণনাকারী অন্যান্য প্রক্রিয়াতেও প্রেরণ করা হয়। এবং যদি আপনার পটভূমিতে কোনও প্রক্রিয়া থাকে তবে এটিতে এখনও ফাইল বর্ণনাকারী থাকবে।

উদাহরণটি ব্যবহার করে 3>&1, এর অর্থ ফাইল ডেস্ক্রিপ্টর তৈরি করুন 3 বর্তমানে ডেস্ক্রিপ্টর 1 দ্বারা উল্লিখিত ফাইলটিকে বোঝায়।

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