কোনও ফাইলের আউটপুটকে নিজের কাছে পুনর্নির্দেশ করা কেন একটি ফাঁকা ফাইল তৈরি করে?


19

কোনও ফাইলের আউটপুটকে নিজের কাছে পুনর্নির্দেশ করা কেন একটি ফাঁকা ফাইল তৈরি করে?

বাশে স্থির, কেন করবেন do

less foo.txt > foo.txt

এবং

fold foo.txt > foo.txt

একটি খালি উত্পাদন foo.txt? যেহেতু একটি পরিশিষ্ট যেমন less eggs.py >> eggs.pyপাঠ্যের দুটি অনুলিপি তৈরি করে eggs.py, কেউ আশা করতে পারে যে ওভাররাইট পাঠ্যের একটি অনুলিপি তৈরি করবে।

দ্রষ্টব্য, আমি বলছি না যে এটি একটি বাগ, এটি সম্ভবত ইউনিক্সের গভীর কিছুতে নির্দেশক।


ইউ অ্যান্ড এলের ক্যানোনিকালটিতে যুক্ত শেলের নিয়ন্ত্রণ এবং পুনঃনির্দেশ অপারেটরগুলি কী কী? প্রশ্ন।
স্কট

উত্তর:


20

আপনি যখন ব্যবহার করবেন >, ফাইলটি কাটা মোডে খোলা হবে যাতে কমান্ড এটি পড়ার চেষ্টা করার আগে এর সামগ্রীগুলি মুছে ফেলা হয়।

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

আপনি যদি কোনও কমান্ডের সাহায্যে ইনপুট এবং আউটপুট হিসাবে কোনও ফাইল ব্যবহার করতে চান যা জায়গা পরিবর্তনে সমর্থন করে না, আপনি বেশ কয়েকটি কাজের পরিমাণ ব্যবহার করতে পারেন:

  • একটি মধ্যস্থতাকারী ফাইল ব্যবহার করুন এবং সম্পন্ন হয়ে গেলে মূলটি ওভাররাইট করুন এবং কেবল ইউটিলিটি চালানোর সময় কোনও ত্রুটি ঘটেনি (এটি সবচেয়ে নিরাপদ এবং আরও সাধারণ উপায়)।

    fold foo.txt > fold.txt.$$ && mv fold.txt.$$ foo.txt
  • কোনও ত্রুটি বা বাধা ঘটলে কোনও সম্ভাব্য আংশিক বা সম্পূর্ণ ডেটা ক্ষতিতে ব্যয় করে মধ্যস্থতাকারী ফাইলটি এড়িয়ে চলুন। এই উদাহরণস্বরূপ, ফাইলগুলি মোছার আগে বিষয়বস্তুগুলি সাবসেলের (প্রথম বন্ধনের অভ্যন্তরে) foo.txtইনপুট হিসাবে পাস হবে। পূর্ববর্তী ইনোডটি জীবন্ত থাকে কারণ ডেটা পড়ার সময় সাবসেলটি এটি খোলা রাখে। অন্তর্গত ইউটিলিটি দ্বারা লিখিত ফাইল (এখানে ) একই নাম থাকার সময় (foldfoo.txt) একটি ভিন্ন ইনোডের দিকে নির্দেশ করে কারণ পুরানো ডিরেক্টরি এন্ট্রি এত প্রযুক্তিগতভাবে সরিয়ে দেওয়া হয়েছে, প্রক্রিয়া চলাকালীন একই নামের দুটি পৃথক "ফাইল" রয়েছে। সাবশেলটি শেষ হয়ে গেলে, পুরানো ইনোডটি প্রকাশিত হয় এবং এর ডেটা নষ্ট হয়। পুরানো ফাইল এবং নতুন দুটি একইসাথে অস্থায়ীভাবে সংরক্ষণের জন্য আপনার পর্যাপ্ত জায়গা রয়েছে তা নিশ্চিত হওয়ার বিষয়ে সতর্ক থাকুন অন্যথায় আপনি ডেটা হারাবেন।

    (rm foo.txt; fold > foo.txt) < foo.txt

3
spongeথেকে moreutils এছাড়াও সাহায্য করতে পারেন। fold foo.txt | sponge foo.txt- বা fold foo.txt | sponge !$করাও উচিত।
slhck

@ এসএলএইচইচকি প্রকৃতপক্ষে, স্পঞ্জও কাজটি করতে পারে। যাইহোক, ওপেনের মতো ইউনিক্সে পসিক্স বা মূলধারার দ্বারা নির্দিষ্ট না হওয়া, এটি উপস্থিত হওয়ার সম্ভাবনা কম।
jlliagre

মনে হচ্ছে এটা হতে পারে না না তৈরি ); যদিও বর্তমান
slhck

7

অ্যাপ্লিকেশনটি পড়ার সুযোগ হওয়ার আগে ফাইলটি শেল দিয়ে লেখার জন্য খোলা হয়। লেখার জন্য ফাইলটি খোলার সাথে সাথে এটি কেটে যায়।


0

বাশে, বাম অপারেন্ডকে মূল্যায়ন করার আগে স্ট্রিম রিডাইরেকশন অপারেটরটি ... > foo.txtখালি করে ।foo.txt

কেউ কমান্ড প্রতিস্থাপন ব্যবহার করতে পারে এবং তার ফলাফলটি এক কার্যকারণ হিসাবে মুদ্রণ করতে পারে। এই সমাধানটি অন্যান্য উত্তরের চেয়ে কম অতিরিক্ত অক্ষর গ্রহণ করে:

printf "%s\n" "$(less foo.txt)" > foo.txt

সাবধানতা: এই কমান্ডটি কোনও ট্রেলিং নিউলাইন (গুলি) সংরক্ষণ করে না foo.txt। আরও তথ্যের জন্য নীচের মন্তব্য বিভাগে দেখুন

এখানে, স্ট্রিম পুনর্নির্দেশ অপারেটরের আগে সাবশেলটি $(...)মূল্যায়ন করা হয় , সুতরাং তথ্য সংরক্ষণ করা।>


@ কামিলম্যাসিওরওস্কি: আসলে, আছে tmp=$(cmd; printf q);  printf '%s' "${tmp%q}"। তবে আপনি এই উত্তরের সাথে অন্য একটি সমস্যা মিস করেছেন: এটি "সাবশেল" বলে যখন এটি "কমান্ড প্রতিস্থাপন" অর্থ। হ্যাঁ, কমান্ডের বিকল্পগুলি সাধারণত সাবশেল হয় তবে তদ্বিপরীত হয় না এবং সাধারণভাবে সাবসেলগুলি এই সমস্যার জন্য কোনও সহায়তা নয়।
স্কট

@ কামিলম্যাসিওরওস্কি এই সমস্ত মিস করার জন্য আমার খুব খারাপ লাগছে। এই সমস্ত নির্দেশ করার জন্য ধন্যবাদ। আপনার (4) তম পয়েন্টের জন্য: ব্যাককোটগুলি কী ট্রিক করবে অর্থাত্ নতুন লাইনের (গুলি) সংরক্ষণ করবে?
লুই-জ্যাকব লেবেল

আপনার জবাবের জন্য @ স্কট ধন্যবাদ। আমি "কমান্ড সাবস্টিটিউশন" এর জন্য "সাবশেল" পরিবর্তন করেছি। যাইহোক, আমি দুজনের মধ্যে ঠিক পার্থক্য কি অবাক।
লুই-জ্যাকব লেবেল

না, ব্যাককোটিস (ব্যাকটিক্স) স্ট্রিপটিও নতুন লাইনের অক্ষরগুলি অনুসরণ করে।
কামিল ম্যাকিয়েরোস্কি

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