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
আপনি ইতিমধ্যে খোলা কোনও ফাইল মুছে ফেলার সময় আপনি যতক্ষণ হ্যান্ডেলটি চারদিকে রাখছেন ততক্ষণ আপনি এতে অ্যাক্সেস ধরে রাখবেন, যাতে এটি মুছে ফেলা ফাইলটির বাইরে থাকা ডেটা পড়তে পারে can এইভাবে perl
কোনও অস্থায়ী ফাইলের পরিবর্তে আউটপুট ফাইলটিতে সরাসরি লিখুন: কোনও অতিরিক্ত ফাইল তৈরি করা হয় না, তবে আপনি যদি প্রক্রিয়া চলাকালীন ফাইলটি পড়েন তবে আপনি আংশিক বিষয়বস্তু পাবেন, sed
এর পদ্ধতির সাথে ভিন্ন unlike এখানে একটি সংক্ষিপ্ত সময় রয়েছে যখন সঠিক নাম সহ কোনও ফাইল নেই, যা প্রক্রিয়াটি শুরু হওয়ার পরিবর্তে (যেমন হিসাবে sed -i .bak
) শুরু হয়।
sed
এবং উভয়ই perl
:
- একটি সাধারণ ফাইলের সাথে একটি প্রতীকী লিঙ্কটি প্রতিস্থাপন করুন।
- শক্ত লিঙ্কগুলি বিরতি দিন।
- সম্ভব হলে গোষ্ঠীর মালিকানা রক্ষা করুন।
- আপনার ডিফল্ট গোষ্ঠী (বা সেই ডিরেক্টরিটি যদি
setgid
বিট থাকে তবে মূল ডিরেক্টরিটির গোষ্ঠী) দিয়ে ফাইলটি তৈরি করুন যদি এটি এমন কোনও গ্রুপের মালিকানাধীন যেখানে আপনি নেই এবং আপনি রুট নন।
- আপনি যদি রুট হন তবে ফাইলের মালিকানা সংরক্ষণ করুন।
- প্রাথমিক অনুমতি সংরক্ষণ করুন।
- ফলাফল
setuid
এবং setgrp
বিটগুলি সংরক্ষণ করুন , যদি ফলাফলের গোষ্ঠীটি শুরু হওয়া গোষ্ঠীর সমান হয়।
- স্টিকি বিট সংরক্ষণ করুন।
- এক্সটার্স সংরক্ষণ করা হয় না ।
sed
ইচ্ছাশক্তি:
- এসিএল সংরক্ষণ করুন (লিনাক্সে; আমি অন্যদের সম্পর্কে জানি না) ।
perl
ইচ্ছাশক্তি:
উপরেরটি জিএনইউযুক্ত লিনাক্স sed
এবং ম্যাক ওএস এক্স এর (ফ্রিবিএসডি-প্রাপ্ত) দ্বারা সত্য sed
।