मैं / देव / अशक्त से पढ़ सकता हूं; इसे कैसे जोड़ेंगे?


80

मैं विकिपीडिया लेख को/dev/null पढ़ता हूं और फाइलों को आगे बढ़ाता हूं /dev/null

इसके लिए मैंने एक test_fileसामग्री बनाई और उसमें कुछ सामग्री दी:

$ touch test_file
$ echo "This is written by Aditya" > test_file
$ cat test_file
This is written by Aditya

इसके बाद मैंने फ़ाइल को यहां ले जाने की कोशिश की /dev/null:

$ mv test_file /dev/null
mv: inter-device move failed: ‘test_file’ to ‘/dev/null’; unable to remove target: Permission denied

चूंकि, इससे मुझे एक Permission deniedत्रुटि मिली; मैं आगे बढ़ गया और sudoजब भी मैं एक Permission deniedत्रुटि का सामना करता हूं तो मैं सामान्य रूप से उपयोग करता हूं ।

$ sudo mv test_file /dev/null

आदेश सफल हुआ और test_fileअब निर्देशिका में मौजूद नहीं है।

हालाँकि, विकिपीडिया लेख कहता है कि इसे स्थानांतरित करने के लिए कुछ भी पुनर्प्राप्त करना संभव नहीं है /dev/nullऔर यह EOFकिसी भी प्रक्रिया को देता है जो इससे पढ़ने की कोशिश करता है। लेकिन, मैं इससे पढ़ सकता हूं /dev/null:

$ cat /dev/null
This is written by Aditya

मैंने क्या गलत किया और मैं /dev/nullवापस सामान्य कैसे हो गया? और मुझे Permission deniedपहली बार में त्रुटि क्यों हुई?

जवाबों:


147

/dev/nullएक फाइल है। एक विशेष फाइल। एक डिवाइस फ़ाइल जैसे / dev / sda या / dev / tty जो आपके सिस्टम पर हार्डवेयर के एक टुकड़े से बात करती है।

इसके साथ अंतर केवल इतना /dev/nullहै कि कोई भी हार्डवेयर इससे जुड़ा नहीं है। आपके द्वारा भेजा गया कोई भी डेटा चुपचाप छोड़ दिया जाता है। निम्नलिखित कमांड की तरह:

echo "Hello World" > /dev/null

जो आपके टर्मिनल पर कुछ भी प्रिंट नहीं करेगा क्योंकि आप echoशून्य के आउटपुट को शून्य पर भेजते हैं , इस प्रकार एक ब्लैक होल।

लेकिन जब आपने किया है mv test_file /dev/nullतो आपने विशेष फ़ाइल /dev/nullको एक सामान्य टेक्स्ट फ़ाइल से बदल दिया है , जो आपकी सामग्री की एक प्रति पकड़े हुए है test_file। दूसरे शब्दों में, आपने अपना खो दिया है /dev/null

अब, आपको क्या करना है (इसे फिर से बनाना):

sudo rm /dev/null
sudo mknod -m 0666 /dev/null c 1 3

आपको इसे फिर से बनाना चाहिए क्योंकि डिफ़ॉल्ट रूप से बहुत सी स्क्रिप्ट आउटपुट भेजती हैं /dev/null। यदि /dev/nullकोई अधिक ब्लैक होल नहीं है, लेकिन एक नियमित पाठ फ़ाइल है, तो यह आपके फाइल-सिस्टम को विकसित और विकसित कर सकता है। और मुझे यकीन है कि आप इससे बचना चाहते हैं।

और बहुत अधिक खतरनाक, बहुत सारी स्क्रिप्ट यह मानती हैं कि पढ़ने से /dev/nullकुछ नहीं होगा; इस धारणा को तोड़ने से आपके सिस्टम के चारों ओर फ़ाइलों में लिखे गए यादृच्छिक कचरा हो सकते हैं ... ठीक करने के लिए व्यावहारिक रूप से असंभव है।

और याद रखें कि लिनक्स मल्टी-टास्किंग है: जब आप खेल रहे होते हैं /dev/null, तो बहुत सारी प्रक्रियाएं चल रही होती हैं और कुछ सेकंड "अवसर की खिड़की" के दौरान भी कहर बरपा सकती हैं।

यदि आप अपने साथ खेलना चाहते /dev/nullहैं तो एक प्रति बना सकते हैं और उसके साथ प्रयोग कर सकते हैं:

sudo mknod -m 0666 /tmp/null c 1 3 

एक ऐसी /tmp/nullफ़ाइल बनाएगा जो ठीक उसी तरह से काम करती है, /dev/nullलेकिन आप अपने सिस्टम के लिए बिना किसी जोखिम के हेरफेर और परीक्षण कर सकते हैं।


16

एक फ़ाइल को ओवरराइट करने और एक फ़ाइल पर लिखने के बीच एक बड़ा अंतर है ।

जब आप कुछ लिखते हैं /dev/null , जैसे,

$ echo Hello > /dev/null

... यह चुपचाप त्याग दिया जाता है। इसके लिए आपको लिखने की अनुमति चाहिए /dev/null, जो सभी के पास है:

$ ls -l /dev/null 
crw-rw-rw- 1 root root 1, 3 Mar 18 13:17 /dev/null

जब आप अधिलेखित करते हैं /dev/null , जैसा कि आपने mvकमांड के साथ किया था , तो आप विशेष फ़ाइल /dev/nullको वहां स्थानांतरित करने के साथ प्रतिस्थापित करते हैं । यह मत करो! कारण जो आपको करने के लिए रूट विशेषाधिकारों की आवश्यकता थी, क्योंकि एक फ़ाइल को अधिलेखित करने के लिए, आपको उस निर्देशिका में लिखने की अनुमति चाहिए जिसमें फ़ाइल शामिल है , इस मामले में /dev:

$ ls -ld /dev
drwxr-xr-x 16 root root 4640 Mar 18 13:17 /dev

पुनर्स्थापित करने के लिए /dev/null, आदेश जारी करें

$ sudo rm /dev/null
$ sudo mknod -m 0666 /dev/null c 1 3

( U & L StackExchange देखें: कैसे बनाएं/dev/null )


8

जब आप कमांड चलाते हैं

$ sudo mv test_file /dev/null

आपने अपनी पाठ फ़ाइल के साथ विशेष फ़ाइल को बदल दिया है /dev/null/dev/nullआपकी पाठ फ़ाइल की सामग्री, और /dev/nullसामान्य तरीके से उपयोग करने का प्रयास करने वाले कार्यक्रमों से संभवतः पढ़ने के बाद आने वाले प्रयास संभवतः टूट जाएंगे।

डिवाइस फ़ाइलों को बदलने या हटाने के /dev/लिए सुपरसुसर विशेषाधिकारों की आवश्यकता होती है, यही वजह है कि आपका गैर-सुडो प्रयास एक त्रुटि के साथ विफल हो गया।

/dev/nullमैन्युअल रूप से पुनर्स्थापित करने के तरीके के बारे में जानकारी के लिए बेनोइट का उत्तर देखें , लेकिन चूंकि /dev/udv की सामग्री का अधिकांश (यदि सभी नहीं) गतिशील रूप से प्रबंधित किया गया है, मुझे संदेह है कि एक साधारण रिबूट शायद इसे भी ठीक कर देगा।


6

किसी फ़ाइल को निकालने के लिए आपको क्या करना चाहिए, आपके प्रश्न का उत्तर देने के लिए, आप करते हैं:

rm test_file

जैसा कि दूसरों ने कहा है, / देव / अशक्त कार्यक्रमों के उत्पादन के लिए एक गंतव्य है।


2
मैंने डाउनवोट नहीं किया, लेकिन सवाल फ़ाइल को हटाने के बारे में नहीं है ... मुझे पता है कि हम rmफ़ाइलों / निर्देशिकाओं को हटाने के लिए उपयोग करते हैं ... मैंने अभी इसके बारे में /dev/nullऔर अधिक समझने के लिए पढ़ा , मैंने फ़ाइलों को स्थानांतरित करने /dev/nullऔर देखने की कोशिश की प्रभाव .. यह प्रश्न यह समझने के बारे में है कि मैंने फ़ाइलों को स्थानांतरित करके क्या गलत किया /dev/null, जिसके परिणामस्वरूप मैं अब इसे पढ़ सकता हूं ... सवाल यह नहीं है कि सिस्टम से फ़ाइलों को कैसे निकालना है ... मुझे आशा है कि यह है स्पष्ट ... लेकिन आपका जवाब अभी भी स्वागत योग्य है और एक उत्तर के रूप में रखा जाना काफी अच्छा है ... :-)
आदित्य

7
निष्पक्ष होने के लिए, "मैंने क्या गलत किया" यह पूछने के बजाय कि क्या किया जाना चाहिए था, की व्याख्या के लिए। यह संभवतः अधिकांश उपयोगकर्ताओं के लिए तुच्छ है, लेकिन किसी भी अन्य उत्तर ने भी इसका उल्लेख नहीं किया है।
kapex
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.