आप किसी भी चीज़ पर कैट / देव / अशक्त क्यों होंगे?
आप इनोड को बरकरार रखते हुए एक फ़ाइल सामग्री को अलग करने के लिए करेंगे। पढ़ने या लिखने के लिए उस फ़ाइल को खोलने वाले सभी प्रोग्राम इस तथ्य से बाहर प्रभावित नहीं होंगे कि फ़ाइल का आकार शून्य पर रीसेट हो जाएगा।
अक्सर पाया जाने वाला फर्जी विकल्प फ़ाइल को हटा रहा है और इसे फिर से बना रहा है:
rm file
touch file
या इसी तरह:
mv file file.old
gzip file.old
touch file
समस्या यह है कि ये विधियाँ पुरानी फ़ाइल को हटाने की समय पर खुली हुई फ़ाइल को खोलने वाली जो भी प्रक्रियाएँ लिखी जा रही हैं, उन्हें रोकने से रोकती नहीं हैं। यूनिक्स फ़ाइल सिस्टम के अंतर्गत आने का कारण, जब आप किसी फ़ाइल को हटाते हैं, तो आप केवल उसका नाम (पथ) उसकी सामग्री (इनोड) से हटाते हैं। जब तक पढ़ने या लिखने के लिए खुला होने की प्रक्रिया नहीं होती तब तक इनोड को जीवित रखा जाता है।
यह कई नकारात्मक प्रभावों की ओर जाता है: फ़ाइल हटाने के बाद लिखे गए लॉग खो जाते हैं क्योंकि हटाए गए फ़ाइल को खोलने का कोई सीधा / पोर्टेबल तरीका नहीं है। जब तक एक प्रक्रिया हटाए गए फ़ाइल को लिख रही है, तब तक इसकी सामग्री अभी भी फ़ाइल सिस्टम पर स्थान का उपयोग कर रही है। इसका मतलब है कि यदि आप फ़ाइल को हटाते / बनाते हैं क्योंकि यह आपकी डिस्क को भर रहा था, तो डिस्क भर जाती है। इस बाद के मुद्दे को ठीक करने का एक तरीका लकड़हारा प्रक्रियाओं को फिर से शुरू करना है, लेकिन आप ऐसा नहीं करना चाहते हैं कि महत्वपूर्ण सेवाओं और मध्यस्थ लॉग के लिए निश्चित रूप से खो जाएगा। इस तथ्य के कारण भी दुष्प्रभाव हैं कि आपके द्वारा बनाई गई फ़ाइल में मूल एक से अधिक अनुमतियाँ, स्वामी और समूह नहीं हो सकते हैं। उदाहरण के लिए यह लॉग एनालाइज़र को नई बनाई गई फ़ाइल को पढ़ने से रोक सकता है, या इससे भी बदतर, लॉगिंग प्रक्रिया को अपने लॉग को लिखने से रोक सकता है।
पहला तरीका, cat /dev/null > file
लक्ष्य को ठीक से प्राप्त करना , हालांकि, एक कठिन शहरी कथा के बावजूद, इसका cat /dev/null
हिस्सा बिल्कुल उपयोगी नहीं है। यह एक छद्म फ़ाइल खोलता है जो डिज़ाइन द्वारा खाली है, यह इसमें से कुछ भी पढ़ने में विफल रहता है और अंत में बस बाहर निकलता है। इस कमांड का उपयोग करना तब कीस्ट्रोक्स, बाइट्स, सिस्टम कॉल और सीपीयू साइकल की बर्बादी है और इसे बिना किसी कमांड के :
, अधिकांश शेल के साथ, निस्संदेह तेजी से नो-ऑप कमांड द्वारा या किसी भी कार्यात्मक परिवर्तन के बिना बदला जा सकता है ।
मुझे समझाने की कोशिश करो कि कितना बेकार cat /dev/null
है। मान लीजिए कि आपका लक्ष्य एक गिलास खाली करना है।
आप सबसे पहले इसमें से कोई तरल निकालते हैं। यह पर्याप्त है और वास्तव में क्या है ( > file
) यह तथ्य बताता है कि पुनर्निर्देशन हमेशा पहले संसाधित होते हैं।
फिर, आप एक खाली बोतल ( /dev/null
) उठाते हैं और इसे खाली गिलास ( 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
यह एक या तो सिस्टम V sh
एस्केप अनुक्रम का उपयोग करके पोर्टेबल नहीं है । कुछ गोले एक फाइल बनाएंगे जिसमें " \c
" के साथ एक लाइन होगी :
echo "\c" > file
यह एक काम करने के लिए डिज़ाइन की गई कमांड का उपयोग करता है। समस्या का उपयोग truncate
पोर्टेबल नहीं है क्योंकि यह आदेश, POSIX द्वारा निर्दिष्ट नहीं किया जा रहा है, एक यूनिक्स / लिनक्स सिस्टम से गायब हो सकता है।
truncate -s 0
अंत में, यहां कुछ विकल्प दिए गए हैं जो पोर्टेबल हैं और ठीक से काम करेंगे:
स्पष्ट रूप से फ़ाइल को एक रिक्त स्ट्रिंग मुद्रित करना:
printf "" > file
true
आदेश का उपयोग करना, जो सख्ती से एक से :
अधिक किसी भी पठनीय के बराबर है :
true > file