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
।