आप, निर्देशिकाglen
के स्वामी हैं ( अपनी प्रविष्टि में फ़ाइल देखें )। एक निर्देशिका सिर्फ फाइलों की एक सूची है और आपके पास इस सूची को बदलने की अनुमति है (उदाहरण के लिए फ़ाइलें जोड़ें, फ़ाइलों को निकालें, इसे फिर से बनाने के लिए स्वामित्व बदलें, आदि)। आप को बदलने के लिए सक्षम नहीं हो सकता सामग्री सीधे फाइल की है, लेकिन आप पढ़ सकते हैं और कर सकते हैं अनलिंक एक पूरे के रूप फ़ाइल (निकालने के लिए) और नई फ़ाइलें बाद में जोड़ें। 1 केवल पहले और बाद में साक्षी, ऐसा लग सकता है कि फ़ाइल को बदल दिया गया है।.
विम स्वैप फ़ाइलों का उपयोग करता है और पानी के नीचे फ़ाइलों को स्थानांतरित करता है, जिससे यह पता चलता है कि यह उसी फ़ाइल पर लिखना क्यों लगता है जैसे आप अपने शेल में करते हैं, लेकिन यह एक ही बात नहीं है। 2
तो, विम क्या करता है, इसके लिए नीचे आता है:
cat temp > .temp.swp # copy file by contents into a new glen-owned file
echo nope >> .temp.swp # or other command to alter the new file
rm temp && mv .temp.swp temp # move temporary swap file back
1 यह एक महत्वपूर्ण अंतर है विंडोज और यूनीस के बीच फाइल अनुमति हैंडलिंग में। विंडोज में, एक आम तौर पर उन फ़ाइलों को हटाने में सक्षम नहीं होता है जिनके लिए आपके पास लिखित अनुमति नहीं है।
2 अपडेट: जैसा कि टिप्पणियों में कहा गया है, विम वास्तव में स्वामित्व को बदलने के लिए ऐसा नहीं करता है, क्योंकि temp
फ़ाइल पर इनोड नंबर नहीं बदलता है ( ls -li
पहले और बाद में आता है)। strace
हम का उपयोग करके वास्तव में क्या vim
करता है देख सकते हैं । दिलचस्प हिस्सा यहाँ है:
open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = -1 EACCES (Permission denied)
unlink("temp") = 0
open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = 4
write(4, "more text bla\n", 14) = 14
close(4) = 0
chmod("temp", 0664) = 0
यह दिखाता है कि यह केवल अनलिंक करता है, लेकिन फ़ाइल डिस्क्रिप्टर को बंद नहीं करता है temp
। यह बल्कि इसकी पूरी सामग्री ( more text bla\n
मेरे मामले में) को अधिलेखित करता है । मुझे लगता है कि यह बताता है कि इनोड संख्या क्यों नहीं बदलती है।
ls -il
पहले और बाद में चल रहा है ... यदिtemp
इनोड नंबर बदल गया है, तो आप जानते हैं कि यह एक ही नाम के साथ एक अलग फ़ाइल है।