sed एक अस्थायी फ़ाइल बनाता है, उस फ़ाइल में आउटपुट लिखता है, और फिर मूल के शीर्ष पर अस्थायी फ़ाइल का नाम बदल देता है।
आप देख सकते हैं कि क्या होता है strace:
$ strace -e trace=file sed -i -e '' a
execve("/usr/bin/sed", ["sed", "-i", "-e", "", "a"], [/* 34 vars */]) = 0
<...trimmed...>
open("a", O_RDONLY) = 3
open("./sedxvhRY8", O_RDWR|O_CREAT|O_EXCL, 0600) = 4
rename("./sedxvhRY8", "a") = 0
+++ exited with 0 +++
यह सभी फ़ाइल संचालन को लॉग sedकरता है: यह एक नई फ़ाइल बनाता है (सुरक्षित रूप से O_CREAT|O_EXCL), इसमें डेटा लिखता है, और फिर इसे मेरी मूल फ़ाइल के शीर्ष पर वापस ले जाता है a।
sed -iबैकअप के लिए उपयोग करने के लिए एक प्रत्यय स्वीकार करता है, और उस स्थिति में यह मूल को पहले (शीर्ष पर नाम बदलने के बजाय) बाहर ले जाता है। अधिकांश बीएसडी sedएस में यह तर्क अनिवार्य है । इस स्थिति में, संक्षिप्त समय है जब निर्देशिका में सही नाम से कोई फ़ाइल नहीं है।
perl हाल के संस्करणों में इनपुट फ़ाइल को खोलता है, फिर उसे हटाता है और उसी नाम से एक नई फ़ाइल बनाता है:
open("a", O_RDONLY) = 3
unlink("a") = 0
open("a", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4
जब आप unlinkकिसी फ़ाइल को हटाते हैं ( ) तो आपके पास पहले से खुला हुआ है तो आप उस तक पहुंच बनाए रख सकते हैं जब तक आप उसके चारों ओर हैंडल रखते हैं, इसलिए वह डिलीट हुई फ़ाइल से डेटा को पढ़ता रह सकता है। इस तरह perlएक अस्थायी फ़ाइल के बजाय सीधे आउटपुट फ़ाइल में लिखता है: कोई अतिरिक्त फ़ाइल नहीं बनाई गई है, लेकिन यदि आप प्रक्रिया के दौरान फ़ाइल पढ़ते हैं, तो आपको आंशिक सामग्री मिलेगी, इसके विपरीत sed। एक संक्षिप्त समय भी होता है जब सही नाम के साथ कोई फ़ाइल नहीं होती है, जो कि अंत (जैसा कि sed -i .bak) के बजाय प्रक्रिया की शुरुआत में है ।
दोनों sedऔर perlहोगा:
- एक साधारण फ़ाइल के साथ एक प्रतीकात्मक लिंक बदलें।
- कड़ी कड़ी तोड़ो।
- यदि संभव हो तो समूह का स्वामित्व सुरक्षित रखें।
- फ़ाइल को अपने डिफ़ॉल्ट समूह (या मूल निर्देशिका के समूह के साथ बनाएं अगर उस निर्देशिका में
setgidबिट है) यदि वह उस समूह के स्वामित्व में थी जो आप में नहीं हैं और आप जड़ नहीं हैं।
- यदि आप रूट हैं तो फ़ाइल स्वामित्व सुरक्षित रखें।
- बुनियादी अनुमतियाँ संरक्षित करें।
- संरक्षित
setuidऔर setgrpबिट्स, यदि परिणामी समूह उसी समूह के समान है जो इसमें शुरू हुआ था।
- चिपचिपा सा संरक्षित करें।
- Xattrs संरक्षित नहीं है।
sed मर्जी:
- ACLs को संरक्षित करें (लिनक्स पर; मैं दूसरों के बारे में नहीं जानता) ।
perl मर्जी:
उपरोक्त जीएनयू sedऔर मैक ओएस एक्स के साथ लिनक्स पर सच है (फ्रीबीएसडी-व्युत्पन्न) sed।