আপনি কেন বিড়াল / দেব / কোনও কিছুতে নাল করবেন?
আপনি ইনোডটি অক্ষত রেখে ফাইলের বিষয়বস্তুগুলি কেটে ফেলতে পারবেন। যে সমস্ত প্রোগ্রামে ফাইলটি পড়তে বা লেখার জন্য উন্মুক্ত রয়েছে সেগুলি ফাইলের আকার শূন্যে পুনরায় সেট করা হবে তার বাইরে প্রভাবিত হবে না।
প্রায়শই পাওয়া যায় এমন একটি বোগাস বিকল্প ফাইলটি সরিয়ে আবার এটি তৈরি করে:
rm file
touch file
বা অনুরূপ:
mv file file.old
gzip file.old
touch file
সমস্যাটি হ'ল এই পদ্ধতিগুলি মুছে ফেলার সময় মুছে ফেলা ফাইলটি যে কোনও প্রক্রিয়া দ্বারা পুরানো ফাইলটিকে রেকর্ড করা থেকে বিরত রাখে না। ইউনিক্স ফাইল সিস্টেমের অধীনে থাকার কারণ, আপনি যখন কোনও ফাইল মুছে ফেলেন, আপনি কেবলমাত্র এর সামগ্রী (ইনোড) থেকে এর নাম (পাথ) লিঙ্কমুক্ত করেন। পড়া বা লেখার জন্য প্রক্রিয়াটি খোলা থাকার প্রক্রিয়া যতক্ষণ থাকবে ততক্ষণ ইনোডটি জীবন্ত রাখা হয়।
এটি বেশ কয়েকটি নেতিবাচক প্রভাবের দিকে পরিচালিত করে: ফাইল মোছার পরে লেখা লগগুলি হারিয়ে যায় কারণ মুছে ফেলা ফাইলটি খোলার কোনও সরল / বহনযোগ্য উপায় নেই। যতক্ষণ না কোনও প্রক্রিয়া মুছে ফেলা ফাইলটিতে লেখা থাকে ততক্ষণ এটির সামগ্রীটি ফাইল সিস্টেমে স্থান ব্যবহার করে। এর অর্থ হ'ল যদি আপনি ফাইলটি সরিয়ে / তৈরি করেন কারণ এটি আপনার ডিস্কটি পূরণ করে, ডিস্কটি ভরাট থাকে। এই পরবর্তী সমস্যাটি সমাধান করার একটি উপায় হ'ল লগার প্রক্রিয়াগুলি পুনরায় আরম্ভ করা তবে আপনি সম্ভবত এটি করতে চান না এবং সমালোচনামূলক পরিষেবা এবং মধ্যস্থতাকারী লগগুলি অবশ্যই হারিয়ে যাবে। পার্শ্ব প্রতিক্রিয়াগুলিও রয়েছে যে কারণে আপনি যে ফাইলটি তৈরি করেন তাতে আসল ফাইলের চেয়ে একই অনুমতি, মালিক এবং গোষ্ঠী নাও থাকতে পারে। উদাহরণস্বরূপ এটি কোনও নতুন তৈরি হওয়া ফাইল পড়তে কোনও লগ বিশ্লেষককে বাধা দিতে পারে বা আরও খারাপ, লগিং প্রক্রিয়াটিকে তার নিজস্ব লগগুলি লিখতে বাধা দিতে পারে।
প্রথম পদ্ধতিটি, cat /dev/null > file
লক্ষ্যটি সঠিকভাবে অর্জন করুন তবে, একটি দৃ urban় শহুরে কিংবদন্তি সত্ত্বেও, এর cat /dev/null
অংশটি কার্যকরভাবে কিছুই করে না। এটি একটি সিউডো ফাইল খুলবে যা ডিজাইনের দ্বারা খালি, এটি এ থেকে কিছু পড়তে ব্যর্থ হয় এবং অবশেষে সবে বের হয়। এই কমান্ডটি ব্যবহার করা কী-স্ট্রোক, বাইটস, সিস্টেম কল এবং সিপিইউ চক্রের অপচয় এবং এটি নিঃসন্দেহে দ্রুত কোনও নো-অপ্ট কমান্ড :
বা এমনকি কোনও শৃঙ্খলা ছাড়াই কোনও শৃঙ্খলাবিহীন কোনও কার্যকরী পরিবর্তন ছাড়াই প্রতিস্থাপন করা যেতে পারে ।
আমাকে কতটা অকেজো cat /dev/null
তা ব্যাখ্যা করার জন্য একটি রূপকের চেষ্টা করি । ধরা যাক আপনার লক্ষ্যটি একটি গ্লাস খালি করা।
আপনি প্রথমে এটি থেকে কোনও তরল সরান। এটি যথেষ্ট এবং যথাযথভাবে হ'ল ( > file
) আসলে পুনর্নির্দেশগুলি সর্বদা প্রক্রিয়া করা হয় given
তারপরে, আপনি একটি খালি বোতল বাছুন ( /dev/null
) এবং খালি গ্লাসে এটি pourালা ( cat
)। এটি অর্থহীন পদক্ষেপ ...
আপনি যদি আপনার লিঙ্কযুক্ত নথিটি শেষ পর্যন্ত পড়ে থাকেন তবে আপনি স্ক্রিপ্টের বর্ধিত সংস্করণ থেকে এই লাইনে থাকা মন্তব্যগুলি লক্ষ্য করতে পারেন:
cat / dev / null> wtmp # ':> wtmp' এবং '> wtmp' এর একই প্রভাব রয়েছে।
তাদের সত্যই আছে; cat /dev/null
কোডে খুব খারাপ রাখা হয়েছিল।
তার মানে হল যে নিম্নলিখিত কোডটি সমস্ত সাধারণ শেল (উভয় csh
এবং sh
পরিবার) নিয়ে কাজ করবে:
cd /var/log
: > messages
: > wtmp
echo "Log files cleaned up."
এবং এই মত, বোর্ন সিনট্যাক্স ব্যবহার সব শাঁস সঙ্গে কাজ করবে ash
, bash
, ksh
, zsh
এবং পছন্দগুলি:
cd /var/log
> messages
> wtmp
echo "Log files cleaned up."
তবে নোট করুন যে প্রাচীন, প্রাক-পসিক্স বোর্ন শেলগুলি সহ, এই কমান্ডগুলির মধ্যে cat /dev/null
একটিও যদি কোনও ফাইল চালানো শেল স্ক্রিপ্ট দ্বারা পরে যুক্ত হয় তবে এটি কোনও ফাইল কেটে ফেলবে না। একটি শূন্য বাইট ফাইলের পরিবর্তে, এটির আকার অপরিবর্তিত থাকতে পারে এমন একটি স্পর্শ ফাইল। ফাইলটি এমন একটি প্রক্রিয়া দ্বারা লিখিত হয় যা অবস্থানটি অনুসন্ধান করার আগে এটি মনে করে যে এটি লেখার আগে বর্তমান।
এ ছাড়াও সাবধান যে কিছু বিকল্প সমাধান প্রায়শই একটি ফাইল কেটে ফেলার পরামর্শ দেয় যাতে ত্রুটি থাকে।
নিম্নলিখিত দুটি লোকই কেবল কাজটি করে না। ফলস্বরূপ ফাইলটি খালি নয় তবে খালি লাইন রয়েছে। এটি wtmp
স্টোরের নির্দিষ্ট প্রস্থের রেকর্ডের মতো লগ ফাইলগুলি ভেঙে ফেলবে ।
echo > file
echo "" > file
বিএসডি sh
বিকল্পের উপরের পরেরটি পোর্টেবল নয়, পসিক্স প্রতিধ্বনির জন্য অনুমোদিত কোনও বিকল্প নির্দিষ্ট করে না যাতে আপনি " -n
" সহ একটি লাইনযুক্ত একটি ফাইল দিয়ে শেষ করতে পারেন :
echo -n > file
এটি কোনও সিস্টেম ভি sh
এস্কেপ ক্রম ব্যবহার করে পোর্টেবল নয় । কিছু শেল " \c
" এর সাথে একটি লাইনযুক্ত একটি ফাইল তৈরি করবে :
echo "\c" > file
এটি একটি কাজ করতে ডিজাইন করা একটি কমান্ড ব্যবহার করে। ইস্যুটি truncate
পোর্টেবল নয় কারণ এই কমান্ডটি, পসআইএক্সএক্স দ্বারা নির্দিষ্ট নয়, এটি ইউনিক্স / লিনাক্স সিস্টেম থেকে অনুপস্থিত হতে পারে।
truncate -s 0
অবশেষে, এখানে কয়েকটি বিকল্প রয়েছে যা পোর্টেবল এবং সঠিকভাবে কাজটি করবে: