जवाबों:
cat /dev/null > file.txtबिल्ली का एक बेकार उपयोग है ।
मूल रूप से cat /dev/nullबस catकुछ भी नहीं उत्पादन में परिणाम है । हाँ, यह काम करता है, लेकिन यह कई लोगों द्वारा पर आधारित है क्योंकि यह एक बाहरी प्रक्रिया को लागू करने में परिणत होता है जो आवश्यक नहीं है।
यह उन चीजों में से एक है जो सामान्य है क्योंकि यह आम है।
बस का उपयोग करना > file.txtअधिकांश गोले पर काम करेगा, लेकिन यह पूरी तरह से पोर्टेबल नहीं है। यदि आप पूरी तरह से पोर्टेबल चाहते हैं, तो निम्नलिखित अच्छे विकल्प हैं:
true > file.txt
: > file.txt
दोनों :और trueकोई डेटा आउटपुट नहीं करते हैं, और शेल बिलिन हैं (जबकि catएक बाहरी उपयोगिता है), इस प्रकार वे हल्के और अधिक 'उचित' हैं।
अद्यतन करें:
जैसा कि टायलर ने अपनी टिप्पणी में उल्लेख किया है, >| file.txtवाक्यविन्यास भी है ।
अधिकांश गोले में एक सेटिंग होती है जो उन्हें मौजूदा फ़ाइल के माध्यम से काट-छाँट करने से रोकेगी >। आपको >|इसके बजाय उपयोग करना चाहिए । यह मानवीय त्रुटि को रोकने के लिए है जब आप वास्तव में साथ जोड़ना चाहते थे >>। आप व्यवहार को चालू कर सकते हैं set -C।
तो इसके साथ, मुझे लगता है कि किसी फ़ाइल को रौंदने का सबसे सरल, सबसे उचित और पोर्टेबल तरीका होगा:
:>| file.txt
:को POSIX द्वारा बिल्ट-इन किया जाना भी अनिवार्य है, और वास्तव में यह इससे अलग trueहै कि इसे "विशेष" बिल्ट-इन माना जाता है ।
>| fileअधिक स्पष्ट ट्रंकट है।
trueकरने की आवश्यकता नहीं है और यह परंपरागत रूप से नहीं था। :बॉर्न परिवार के सभी गोले में बनाया गया है। :POSIX प्रति एक विशेष अंतर्निहित है (इसलिए : > fileयदि filePOSIX गोले में लिखने के लिए खुला नहीं हो सकता है तो शेल से बाहर निकल जाएगा ) और trueनहीं है। POSIX में भी उल्लेख है कि कुछ प्रणालियों की तुलना में :अधिक कुशल हो सकता है true।
Bourne POSIX zsh csh/tcsh rc/es fish
> file Y Y N(1) N(1) N N
: > file N/Y(2) Y(3) Y Y(4) N(5) N(5)
true > file Y(5) Y Y Y(5) Y(5) Y(5)
cat /dev/null > file Y(5) Y Y(5) Y(5) Y(5) Y(5)
eval > file Y(3,8) Y(3) Y Y(6) Y Y
cp /dev/null file (7) Y(5) Y Y(5) Y(5) Y(5) Y(5)
printf '' > file Y(5) Y Y Y(5) Y(5) Y
टिप्पणियाँ:
shया kshएमुलेशन को छोड़कर , zsh में, एक डिफॉल्ट कमांड को माना जाता है (केवल catस्टड रिडायरेक्शन के लिए एक पेजर, अन्यथा), जिसे NULLCMD और READNULLCLCD चर के साथ ट्यून किया जा सकता है। यह इसी तरह की सुविधा से प्रेरित है(t)csh:UnixV7 में शुरू में पुनर्निर्देशन नहीं किया :गया था क्योंकि एक टिप्पणी नेता और एक अशक्त कमांड के बीच आधे रास्ते की व्याख्या की गई थी। बाद में वे सभी बिल्डिंस के लिए पसंद करते थे, यदि पुनर्निर्देशन विफल हो जाता है, जो शेल से बाहर निकलता है।:और evalविशेष अंतर्निहित होने के नाते, यदि पुनर्निर्देशन विफल हो जाता है, तो शेल से बाहर निकलता है ( bashकेवल POSIX मोड में ऐसा करता है)।(t)csh, यह एक अशक्त लेबल (के लिए goto) को परिभाषित कर रहा है , इसलिए goto ''वहां शाखा होगी। यदि पुनर्निर्देशन विफल रहता है, जो शेल से बाहर निकलता है।$PATH( :आम तौर पर नहीं है, true, cat, cpऔर printfआम तौर पर कर रहे हैं (इसे POSIX उन्हें आवश्यकता है))।fileएक गैर-मौजूदा फ़ाइल के लिए एक सहानुभूति है, तो कुछ cpकार्यान्वयन जैसे कि GNU के इसे बनाने से इंकार कर देगा।(यह खंड अत्यधिक व्यक्तिपरक है)
> file। यह >एक संकेत या एक टिप्पणी की तरह बहुत ज्यादा लग रहा है। यह भी प्रश्न मैं पढ़ते समय पूछूंगा कि (और अधिकांश गोले उसी के बारे में शिकायत करेंगे) क्या आउटपुट वास्तव में आप पुनर्निर्देशित कर रहे हैं? ।: > file। :नो-ऑप कमांड के रूप में जाना जाता है। ताकि एक खाली फाइल उत्पन्न करने के रूप में सीधे पढ़ता है। हालाँकि, यहाँ फिर से, :आसानी से याद किया जा सकता है और / या एक संकेत के रूप में देखा जा सकता है।true > file: बूलियन को पुनर्निर्देशन या फ़ाइल सामग्री के साथ क्या करना है? यहाँ क्या मतलब है? पहली बात यह है कि मेरे मन में आता है जब मैंने पढ़ा है किcat /dev/null > file। CONCATENATE /dev/nullमें file? catअक्सर आदेश फ़ाइल की सामग्री डंप के रूप में देखा जा रहा है, कि अभी भी समझ बनाने के कर सकते हैं: की सामग्री डंप में खाली फ़ाइलfile , एक जटिल रास्ते की तरह एक सा कहने के लिए cp /dev/null file, लेकिन अभी भी समझ में आता है।cp /dev/null file। खाली फ़ाइल की सामग्री की प्रतिलिपि बनाता है file। समझ में आता है, हालांकि किसी को यह नहीं पता है कि cpडिफ़ॉल्ट रूप से कैसे करना है, आपको लगता है कि आप fileएक nullउपकरण बनाने की कोशिश कर रहे हैं ।eval > fileया eval '' > file। कुछ भी नहीं चलाता है और इसके उत्पादन को पुनर्निर्देशित करता है file। मेरी समझ मे आ रहा है। अजीब बात है कि यह एक सामान्य मुहावरा नहीं है।printf '' > file: स्पष्ट रूप से एक फ़ाइल में कुछ भी प्रिंट नहीं करता है। वह जो मेरे लिए सबसे ज्यादा मायने रखता है।अंतर यह है कि हम शेल शेल का उपयोग कर रहे हैं या नहीं। यदि नहीं, तो एक प्रक्रिया को कांटा जाता है, कमांड लोड और निष्पादित होता है।
evalसभी गोले में निर्मित होने की गारंटी है। :जहाँ भी यह उपलब्ध है (बॉर्न / csh पसंद) निर्मित है। trueबॉर्न-जैसे गोले में ही बनाया गया है।
printfबिल्ट-इन सबसे आधुनिक बोर्न-जैसे गोले हैं और fish।
cpऔर catआमतौर पर बिल्ट-इन नहीं होते हैं।
अब cp /dev/null fileशेल पुनर्निर्देशन को लागू नहीं करता है, इसलिए चीजें इस तरह हैं:
find . -exec cp /dev/null {} \;
से अधिक कुशल होने जा रहे हैं:
find . -exec sh -c '> "$1"' sh {} \;
(हालांकि जरूरी नहीं:
find . -exec sh -c 'for f do : > "$f"; done' sh {} +
)।
व्यक्तिगत रूप से, मैं : > fileबॉर्न-जैसे गोले में उपयोग करता हूं , और इन दिनों बॉर्न-जैसे गोले के अलावा कुछ भी उपयोग नहीं करता हूं।
dd of=file count=0?
dd(सोलारिस 10 की तरह कम से कम) के कुछ कार्यान्वयन के साथ , count=0नजरअंदाज कर दिया जाता है। dd if=/dev/null of=fileअधिक पोर्टेबल होगा। किसी भी मामले में, यह शेल से स्वतंत्र है।
cp /dev/null file, है ना?
cp /dev/null fileएक सामान्य मुहावरा है। मैं उन लोगों को सीमित कर रहा हूं, यह बिंदु सभी संभावित तरीकों को सूचीबद्ध करने का नहीं है।
आप देखना चाह सकते हैं truncate, जो ठीक यही करता है: किसी फ़ाइल को काट देना।
उदाहरण के लिए:
truncate --size 0 file.txt
यह संभवतः उपयोग करने की तुलना में धीमा है true > file.txt।
हालांकि मेरा मुख्य बिंदु यह है: truncateफ़ाइलों को ट्रंक करने के लिए अभिप्रेत है, जबकि> किसी फ़ाइल को रौंदने का साइड इफेक्ट है।
truncateउपलब्ध होगा, लेकिन न तो >और न ही unistdC लाइब्रेरी उपलब्ध होगी?
truncateएक फ्रीबीएसडी उपयोगिता है, अपेक्षाकृत हाल ही में (2008) जीएनयू कोर्यूटिल्स में जोड़ी गई (हालांकि --sizeजीएनयू लॉन्ग ऑप्शन स्टाइल जीएनयू विशिष्ट है), इसलिए यह गैर-जीएनयू-या-फ्रीबीएसडी सिस्टम में उपलब्ध नहीं है, और यह पुराने जीएनयू सिस्टम में उपलब्ध नहीं है, मैं यह नहीं कहूंगा कि यह पोर्टेबल है। cp /dev/null fileशेल पुनर्निर्देशन के बिना काम करेगा और अधिक पोर्टेबल होगा।
इसका उत्तर थोड़ा सा इस बात पर निर्भर करता है कि file.txtयह क्या है, और प्रक्रिया इसे कैसे लिखती है!
मैं एक सामान्य उपयोग के मामले का हवाला देता हूँ: आपके पास एक बढ़ती हुई लॉगफ़ाइल है file.txt, और इसे घुमाना चाहते हैं।
इसलिए आप उदाहरण के लिए कॉपी,, file.txtमें file.txt.save, तो काटना file.txt।
इस परिदृश्य में, यदि फ़ाइल द्वारा नहीं खोला गया है another_process(उदाहरण के लिए: another_processउस फ़ाइल के लिए आउटपुट प्रोग्राम हो सकता है, उदाहरण के लिए कोई प्रोग्राम लॉगिंग कुछ), तो आपके 2 प्रस्ताव बराबर हैं, और दोनों अच्छी तरह से काम करते हैं (लेकिन 2 के रूप में पसंद किया जाता है) पहला "cat / dev / null> file.txt" बिल्ली का एक बेकार उपयोग है और यह भी खुलता और पढ़ता है / dev / null)।
लेकिन असली परेशानी यह होगी कि क्या other_processवह अभी भी सक्रिय है, और अभी भी एक खुला हैंडल file.txt पर जा रहा है।
फिर, 2 मुख्य मामले उत्पन्न होते हैं, other processजो फ़ाइल को खोलने पर निर्भर करता है :
यदि other_processइसे सामान्य तरीके से खोलता है, तो हैंडल अभी भी फ़ाइल में पूर्व स्थान की ओर इशारा करेगा, उदाहरण के लिए 1200 बाइट्स ऑफसेट। इसलिए अगला लेखन ऑफसेट 1200 पर शुरू होगा, और इस तरह आपके पास फिर से 1200bytes (+ जो भी अन्य_प्रोसेस ने लिखा है) की एक फ़ाइल होगी, जिसमें 1200 प्रमुख अशक्त अक्षर होंगे! आप जो चाहते हैं , मैं नहीं मानता।
यदि "एपेंड मोड" में other_processखोला file.txtगया है, तो हर बार जब यह लिखता है, तो पॉइंटर सक्रिय रूप से फ़ाइल के अंत की तलाश करेगा। इसलिए, जब आप इसे काटते हैं, तो यह बाइट 0 तक "तलाश" करेगा, और आपके बुरे दुष्प्रभाव नहीं होंगे! यह वही है जो आप चाहते हैं ... (आमतौर पर!)
ध्यान दें कि इसका मतलब है कि आपको जरूरत है, जब आप किसी फ़ाइल को काटते हैं, यह सुनिश्चित other_processकरने के लिए कि उस स्थान पर सभी लेखन अभी भी "एपेंड" मोड में खोला है। अन्यथा आपको other_processउन्हें रोकने की आवश्यकता होगी , और उन्हें फिर से शुरू करना होगा, इसलिए वे पूर्व स्थान के बजाय फ़ाइल की शुरुआत में इंगित करना शुरू करते हैं।
संदर्भ: क्लीनर की व्याख्या के लिए /programming//a/16720582/1841533 , और /programming//a/984761/1841533 पर लॉगिंग सामान्य और अपेंड मोड के बीच अंतर का एक अच्छा लघु उदाहरण
cat /dev/null > fileऔर a के बीच का अंतर एक > fileहै cat /dev/nullऔर इससे फ़ाइल में कोई अंतर नहीं पड़ता है।
मुझे यह पसंद है और अक्सर इसका इस्तेमाल करते हैं क्योंकि यह क्लीनर दिखता है और ऐसा नहीं है कि किसी ने दुर्घटना से वापसी की कुंजी को मारा:
echo -n "" > file.txt
एक अंतर्निहित भी होना चाहिए?
echoकार्यान्वयन समर्थन नहीं करते हैं -n(और -n<SPC><NL>यहाँ उत्पादन printf '' > file.txtहोगा) अधिक पोर्टेबल (कम से कम आधुनिक / POSIX प्रणालियों में) होगा।