যখন লক্ষ্য ফাইলটি উপস্থিত নেই তখন কি `>>` এর সাথে red> `সমতুল্য পুনর্নির্দেশটি হয়?


80

বাশ বা শ এর মতো একটি শেল বিবেচনা করুন। মধ্যে মৌলিক পার্থক্য >এবং >>একটি মামলা নিজেই টেপা যখন লক্ষ্য ফাইল বিদ্যমান:

  • > ফাইলটি শূন্য আকারে ছাঁটাই করে, তারপর লিখেছে;
  • >> এটি কেটে যায় না, এটি ফাইলের শেষে লিখতে (সংযোজন) করে।

যদি ফাইলটি বিদ্যমান না থাকে তবে এটি শূন্য আকারের সাহায্যে তৈরি করা হবে; তারপর লিখিত। এটি উভয় অপারেটরের ক্ষেত্রে সত্য। লক্ষ্য ফাইলটি উপস্থিত না থাকলে অপারেটররা সমতুল্য বলে মনে হতে পারে।

তারা আসলেই কি?

উত্তর:


107

TL; ড

নংটি >>মূলত "সর্বদা ফাইলের সমাপ্তির চেষ্টা করা হয়" যখন >সর্বশেষ লিখিত অবস্থানে একটি পয়েন্টার বজায় রাখে।


পুরো উত্তর

(দ্রষ্টব্য: আমার সমস্ত পরীক্ষাগুলি ডেবিয়ান জিএনইউ / লিনাক্স 9 এ সম্পন্ন হয়েছে)।

আর একটি পার্থক্য

না, তারা সমতুল্য নয়। আরও একটি পার্থক্য আছে। লক্ষ্য ফাইলটি আগে ছিল কিনা তা নির্বিশেষে এটি নিজেই প্রকাশ করতে পারে।

এটি পর্যবেক্ষণ করতে, এমন একটি প্রক্রিয়া চালান যা ডেটা উত্পন্ন করে এবং একটি ফাইলের সাথে >বা >>(যেমন pv -L 10k /dev/urandom > blob) পুনঃনির্দেশ red এটি চালানো যাক এবং ফাইলের আকার পরিবর্তন করুন (উদাহরণস্বরূপ truncate)। আপনি দেখতে পাবেন যে >এটি >>সর্বদা শেষ হওয়ার সাথে সাথে (বাড়তে থাকা) অফসেট রাখে ।

  • আপনি যদি ফাইলটিকে একটি ছোট আকারে ছাঁটাই করেন (এটি শূন্য আকারের হতে পারে)
    • >পাত্তা দেবে না, এটি তার পছন্দসই অফসেটে লিখবে যেন কিছুই হয়নি; অফসেটটি কেটে ফেলার পরে ফাইলের শেষের বাইরে চলে যাওয়ার পরে, ফাইলটি তার পুরানো আকারটি ফিরে পেতে এবং আরও বাড়বে, অনুপস্থিত ডেটা শূন্যে পূরণ করা হবে (যদি সম্ভব হয় তবে খুব কম);
    • >> নতুন প্রান্তে যুক্ত হবে, ফাইলটি তার কাটা আকার থেকে বাড়বে।
  • আপনি যদি ফাইলটি বড় করেন
    • >পাত্তা দেবে না, এটি তার পছন্দসই অফসেটে লিখবে যেন কিছুই হয়নি; অফসেটটি ফাইলের অভ্যন্তরে কোথাও উপস্থিত আকার পরিবর্তন করার পরে, এটি কিছুক্ষণের জন্য ফাইলটি বাড়ানো বন্ধ করে দেবে, যতক্ষণ না অফসেটটি নতুন প্রান্তে পৌঁছায়, তারপরে ফাইলটি স্বাভাবিকভাবে বৃদ্ধি পাবে;
    • >> নতুন প্রান্তে যুক্ত হবে, ফাইলটি তার প্রসারিত আকার থেকে বাড়বে।

আর একটি উদাহরণ হ'ল >>ডেটা তৈরির প্রক্রিয়া চলমান থাকাকালীন এবং ফাইলটিতে লেখার সময় অতিরিক্ত কিছু সংযোজন (পৃথক সাথে )। এটি ফাইলটি বড় করার অনুরূপ।

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

উদাহরণ

এটি বাস্তবে কোন ব্যাপার? নেই এই প্রশ্নের :

আমি একটি প্রক্রিয়া চালাচ্ছি যা স্টাডাউটে প্রচুর আউটপুট তৈরি করে। এটিকে একটি ফাইলে পাঠানো হচ্ছে [...] আমি কি কোনও ধরণের লগ রোটেশন প্রোগ্রাম ব্যবহার করতে পারি?

এই উত্তরটি বলে সমাধান logrotateসঙ্গে copytruncateবিকল্প যা এই মত কাজ করে:

পুরানো লগ ফাইলটি সরানো এবং allyচ্ছিকভাবে একটি নতুন তৈরি করার পরিবর্তে একটি অনুলিপি তৈরির পরে মূল লগ ফাইলটি ছাঁটাই করুন।

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

তবে যদি logrotateস্বল্পতা সংরক্ষণ না করে অনুলিপিগুলি তৈরি করে, তবে প্রতিবার একটি অনুলিপি তৈরি করার সময় এই নেতৃস্থানীয় শূন্যগুলিকে আরও বেশি করে ডিস্ক স্পেসের প্রয়োজন হবে। আমি সরঞ্জামের আচরণটি তদন্ত করে দেখিনি, উড়ে উড়ে যাওয়া বা সংক্ষেপণের সাথে এটি যথেষ্ট স্মার্ট হতে পারে (যদি সংক্ষেপণ সক্ষম করা থাকে)। তবুও শূন্যগুলি কেবল সমস্যা সৃষ্টি করতে পারে বা সর্বোপরি নিরপেক্ষ হতে পারে; তাদের মধ্যে ভাল কিছুই।

এই ক্ষেত্রে >>পরিবর্তে ব্যবহার >করা উল্লেখযোগ্যভাবে আরও ভাল, এমনকি যদি লক্ষ্য ফাইলটি এখনও তৈরি হতে চলেছে।


কর্মক্ষমতা

যেমনটি আমরা দেখতে পাচ্ছি, দুটি অপারেটর কেবল শুরু করার পরে নয় পরে পরে পৃথকভাবেও কাজ করে। এর ফলে কিছু (সূক্ষ্ম?) পারফরম্যান্স পার্থক্য হতে পারে। আপাতত এটিকে সমর্থন বা প্রত্যাখ্যান করার মতো আমার কাছে কোনও অর্থবহ পরীক্ষার ফলাফল নেই তবে আমি মনে করি আপনি সাধারণভাবে তাদের পারফরম্যান্সটি একই রকম মনে করবেন না।


9
সুতরাং সর্বশেষে লিখিত অবস্থানটির নির্দেশক বজায় রাখার >>সময় মূলত "সর্বদা ফাইলের সমাপ্তির চেষ্টা করা হয়" >। দেখে মনে হচ্ছে যে তারা যেভাবে কাজ করে তাতে কিছু সূক্ষ্ম পারফরম্যান্স পার্থক্য থাকতে পারে ...
মকুবাই

10
সিস্টেম কল পর্যায়ে, >>ব্যবহার O_APPENDপতাকাopen() । এবং আসলে, >ব্যবহার করে O_TRUNC, যখন >>না। এর সংমিশ্রণটিও O_TRUNC | O_APPENDসম্ভব হবে, শেল ভাষা কেবল সেই বৈশিষ্ট্যটি সরবরাহ করে না।
ইলক্কাছু

3
@ জাজমোনটিস, মানক উত্সটি হবে পসিএক্স : পাবস.ওপেনগ্রুপ.আর / অনলাইনপবস / 9 99৯৯৯৯ 99 99৯.২০১৮ সংক্ষেপণ / উপকরণ / but তবে অবশ্যই বাশের ম্যানুয়ালটিতে পুনঃনির্দেশ অপারেটরগুলির বিবরণ রয়েছে, এটি সমর্থন করে না এমন স্ট্যান্ডার্ডগুলি সহ: gnu.org/ সফ্টওয়্যার / বাশ / ম্যানুয়াল / এইচটিএমএল_নোড / পুনর্নির্দেশগুলি
html

2
@ilkkachu আমি দেখেছি এই, সুদ হতে যেমন O_APPEND সম্পর্কে বিস্তারিত যা আমি আপনার মন্তব্যের পরে :) সম্পর্কে হতাশ ছিল ব্যাখ্যা করেছেন: stackoverflow.com/questions/1154446/...
jjmontes

1
@ মকুবাই, যে কোনও বুদ্ধিমান ওএস খুললে ফাইলের দৈর্ঘ্য থাকবে এবং একটি পতাকা চেক করা এবং অফসেটটি শেষ প্রান্তে সরিয়ে অন্য সমস্ত বুককিপিংয়ে অদৃশ্য হয়ে যাবে। প্রত্যেকের আগে একটির O_APPENDসাথে অনুকরণ করার চেষ্টা করা আলাদা হবে যদিও অতিরিক্ত সিস্টেম কল ওভারহেড থাকবে। (এবং অবশ্যই এটি কাজ করবে না, যেহেতু অন্য প্রক্রিয়া এর মধ্যে হতে পারে ))lseek()write()write()
ইলক্কাচু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.