আমি / দেব / নালটিতে পুনঃনির্দেশ করতে একক বা ডাবল এঙ্গেল বন্ধনী ব্যবহার করা উচিত?


18

এখানে বেশিরভাগ উত্তর [ 1 ] [ 2 ] [ 3 ] / dev / নাল এ পুনঃনির্দেশ করতে একটি একক কোণ বন্ধনী ব্যবহার করে:

command > /dev/null

তবে / dev / নালকে যুক্ত করাও কাজ করে:

command >> /dev/null

অতিরিক্ত চরিত্র ব্যতীত, এটি না করার কোনও কারণ আছে কি? এই "ভাল" এর কোনটিই / dev / নাল অন্তর্নিহিত বাস্তবায়নের?

সম্পাদনা: খোলা (2) র manpage বলেছেন lseek append মুডে একটি ফাইল প্রতিটি লেখার আগে বলা হয়:

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

যা আমাকে মনে করে যে ব্যবহারের জন্য একটি ক্ষুদ্র পারফরম্যান্স জরিমানা হতে পারে >>। তবে অন্যদিকে কাটা / ডিভ / নালটিকে সেই নথি অনুসারে একটি অপরিজ্ঞাত অপারেশন বলে মনে হচ্ছে:

O_TRUNC
যদি ফাইলটি ইতিমধ্যে উপস্থিত থাকে এবং এটি একটি নিয়মিত ফাইল এবং অ্যাক্সেস মোড লেখার অনুমতি দেয় (যেমন, এটি O_RDWR বা O_WRONLY) এটি দৈর্ঘ্য 0 এ কাটা হবে If ফাইলটি যদি একটি ফিফো বা টার্মিনাল ডিভাইস ফাইল হয় তবে O_TRUNC পতাকা অগ্রাহ্য করা হবে। অন্যথায়, O_TRUNC এর প্রভাবটি অনির্ধারিত।

এবং পসিক্স স্পেক অনুযায়ী >একটি বিদ্যমান ফাইল কেটে ফেলা হবে , তবে ওটআরআরসিসিটি ডিভাইস ফাইলগুলির জন্য বাস্তবায়ন-সংজ্ঞায়িত এবং কীভাবে / ডিভ / নলটি কেটে যাওয়ার প্রতিক্রিয়া জানাতে হবে সে সম্পর্কে কোনও কথাই নেই

সুতরাং, কাটা / দেব / নাল আসলে অনির্দিষ্ট? এবং লেসিক কলগুলি কী লেখার পারফরম্যান্সে কোনও প্রভাব ফেলবে?

উত্তর:


27

সংজ্ঞা দ্বারা এতে /dev/nullলিখিত যে কোনও কিছু ডুবে যায় , তাই আপনি অ্যাপেন্ড মোডে লিখেন বা না লিখুন এটির কিছুই যায় আসে না, এটি সবই ফেলে দেওয়া হয়। যেহেতু এটি ডেটা সংরক্ষণ করে না, সত্যিকার অর্থে এটি সংযোজন করার মতো কিছুই নেই।

সুতরাং শেষ পর্যন্ত, এটি > /dev/nullএকটি >সংকেত দিয়ে লিখতে কেবল খাটো ।

সম্পাদিত সংযোজন হিসাবে:

উন্মুক্ত (২) ম্যানপেজটি বলেছে যে সংযোজন মোডে প্রতিটি ফাইলে লেখার আগে lseek ডেকে আনা হয়।

আপনি যদি নিবিড়ভাবে পড়েন তবে আপনি এটি দেখতে পাবেন (জোর দেওয়া আমার):

ফাইল অফসেটটি ফাইলের শেষে অবস্থিত, যেন লিসেকের সাথে থাকে (2)

অর্থ, এটা (প্রয়োজন) প্রকৃতপক্ষে কল না lseekসিস্টেম কল, এবং প্রভাব পারেন একই কঠোরভাবে নয়: কলিং lseek(fd, SEEK_END, 0); write(fd, buf, size);ছাড়া O_APPENDappend মুডে একটি লেখার হিসাবে একই নয়, যেহেতু পৃথক কল সঙ্গে অন্য প্রক্রিয়া লিখতে পারে সিস্টেম কলগুলির মধ্যে ফাইল করুন, সংযুক্ত ডেটা ট্র্যাশ করে। সংযোজন মোডে, এটি ঘটে না ( এনএফএসের বাইরে যা সত্যিকারের অ্যাপেন্ড মোড সমর্থন করে না )।

মান টেক্সট উল্লেখ না lseekএই মুহুর্তে, লিখেছেন ফাইলের শেষে যাব শুধু তাই।

সুতরাং, কাটা / দেব / নাল আসলে অনির্দিষ্ট?

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

এবং লেসিক কলগুলি কী লেখার পারফরম্যান্সে কোনও প্রভাব ফেলবে?

এটা পরীক্ষা করো. প্রদত্ত সিস্টেমে নিশ্চিতভাবে জানার একমাত্র উপায়। বা কোথাও থাকলে অ্যাপেনড মোডটি আচরণটি পরিবর্তন করে তা দেখতে উত্সটি পড়ুন।


-3

এটি যদি আপনি চান দক্ষতা, command >&-পরিবর্তে ব্যবহার করুন। এটি ফাইলের বিবরণটিকে পুনঃনির্দেশের চেয়ে বন্ধ করে দেয়, তাই এতে জিনিস লেখার কোনও সময় নষ্ট হয় না।


3
3 টিরও কম স্ট্রিম বন্ধ করবেন না এটি স্ট্যান্ড * বর্ণনাকারীদের এলোমেলো ফাইলের বর্ণনাকারীর সাথে সংজ্ঞা দেয়; সম্ভাব্য বিপর্যয়মূলক ফলাফল সহ।
জোশুয়া

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