ইউনিক্সে, বেশিরভাগ সম্পাদক সম্পাদিত সামগ্রীগুলি সহ একটি নতুন অস্থায়ী ফাইল তৈরি করে কাজ করেন। সম্পাদিত ফাইলটি সংরক্ষণ করা হলে, আসল ফাইলটি মুছে ফেলা হয় এবং অস্থায়ী ফাইলটির নামটি মূল নামকরণ করা হয়। (অবশ্যই ড্যাটালাস রোধে বিভিন্ন সুরক্ষার ব্যবস্থা রয়েছে)) এটি উদাহরণস্বরূপ, (" ইনস -প্লেস") পতাকার সাথে ব্যবহৃত sed
বা perl
যখন ব্যবহৃত হয়েছিল সেই শৈলী -i
, যা আসলে "স্থান" নয়। এটিকে "পুরানো নাম সহ নতুন জায়গা" বলা উচিত ছিল।
এটি ভালভাবে কাজ করে কারণ ইউনিক্স আশ্বাস দেয় (কমপক্ষে স্থানীয় ফাইল সিস্টেমগুলির জন্য) যে একটি খোলা ফাইল বন্ধ না হওয়া অবধি বিদ্যমান থাকবে, এমনকি যদি এটি "মুছে ফেলা" হয় এবং একই নামের নতুন ফাইল তৈরি না হয়। (এটি কাকতালীয় নয় যে ইউনিক্স সিস্টেম কোনও ফাইলকে "মুছে ফেলতে" ডাকে আসলে "আনলিঙ্ক" বলে) শেলটি এমনকি মূল ফাইলটি খোলার পরেও পরিবর্তনগুলি দেখতে পাবে না।
[দ্রষ্টব্য: সমস্ত মান-ভিত্তিক মন্তব্যগুলির মতো, উপরেরটি একাধিক ব্যাখ্যার সাপেক্ষে এবং এনএফএসের মতো বিভিন্ন কোণার-কেস রয়েছে। শিশুরা ব্যতিক্রমগুলি দিয়ে মন্তব্যগুলি পূরণ করতে স্বাগত]
অবশ্যই ফাইলগুলি সরাসরি সংশোধন করা সম্ভব; এটি সম্পাদনা করার উদ্দেশ্যে কেবল খুব সুবিধাজনক নয়, কারণ আপনি যখন কোনও ফাইলে ডেটা ওভাররাইট করতে পারেন, আপনি নীচের সমস্ত ডেটা স্থানান্তর না করে মুছতে বা সন্নিবেশ করতে পারবেন না, যা পুনরায় লেখার জন্য বোঝায়। তদ্ব্যতীত, আপনি যখন এই স্থানান্তরটি করছিলেন তখন ফাইলের বিষয়বস্তু অনির্দেশ্য হবে এবং ফাইলগুলি উন্মুক্ত থাকার প্রক্রিয়াগুলি ভোগ করবে। এটি থেকে দূরে যেতে (উদাহরণস্বরূপ, ডাটাবেস সিস্টেমগুলির মতো), আপনার একটি পরিশীলিত প্রোটোকল এবং বিতরিত লকগুলির একটি পরিশীলিত সেট প্রয়োজন; স্টাফ যা সাধারণত একটি সাধারণ ফাইল সম্পাদনা ইউটিলিটির সুযোগের বাইরে।
সুতরাং, যদি আপনি কোনও শেল দ্বারা প্রক্রিয়া করার সময় কোনও ফাইল সম্পাদনা করতে চান তবে আপনার কাছে দুটি বিকল্প রয়েছে:
আপনি ফাইলটিতে সংযোজন করতে পারেন। এটি সর্বদা কাজ করা উচিত।
আপনি ঠিক একই দৈর্ঘ্যের নতুন সামগ্রীগুলি দিয়ে ফাইলটি ওভাররাইট করতে পারেন । শেলটি ইতিমধ্যে ফাইলটির সেই অংশটি পড়েছে কি না তার উপর নির্ভর করে এটি কাজ করতে পারে না not যেহেতু বেশিরভাগ ফাইল আই / ও-তে পড়া বাফারদের অন্তর্ভুক্ত রয়েছে এবং যেহেতু আমি জানি সমস্ত শেলগুলি এটি কার্যকর করার আগে একটি সম্পূর্ণ যৌগিক কমান্ড পড়ে, তাই আপনি এটি থেকে দূরে সরে যাবেন এটির সম্ভাবনা খুব কম। এটি অবশ্যই নির্ভরযোগ্য হবে না।
আমি পসিক্স স্ট্যান্ডার্ডের এমন কোনও শব্দের কথা জানি না যার ফাইলটি সম্পাদন করার সময় আসলে স্ক্রিপ্ট ফাইলটিতে সংযুক্ত হওয়ার সম্ভাবনা প্রয়োজন, সুতরাং এটি প্রতিটি পিক্সিক্স কমপ্লায়েন্ট শেলটির সাথে কাজ করতে পারে না, প্রায় বর্তমানের অফারটির সাথে কম- এবং কখনও কখনও-পিক্সিক-অনুগত শেল। তাই ওয়াইএমএমভি। তবে যতদূর আমি জানি, এটি ব্যাশের সাথে নির্ভরযোগ্যভাবে কাজ করে।
প্রমাণ হিসাবে, এখানে বাশ-এর কুখ্যাত 99 বোতল বিয়ার প্রোগ্রামের বাস্তবায়ন, যা dd
ওভাররাইট এবং সংযোজন করতে ব্যবহার করে (ওভাররাইটিং সম্ভবত নিরাপদ কারণ এটি বর্তমানে সম্পাদনকারী রেখাকে প্রতিস্থাপন করে, যা সর্বদা সর্বশেষের লাইন থাকে ফাইলটি ঠিক একই দৈর্ঘ্যের একটি মন্তব্য সহ; আমি এটি করেছি যাতে স্ব-পরিবর্তনকারী আচরণ ছাড়াই শেষ ফলাফলটি কার্যকর করা যায়))
#!/bin/bash
if [[ $1 == reset ]]; then
printf "%s\n%-16s#\n" '####' 'next ${1:-99}' |
dd if=/dev/stdin of=$0 seek=$(grep -bom1 ^#### $0 | cut -f1 -d:) bs=1 2>/dev/null
exit
fi
step() {
s=s
one=one
case $beer in
2) beer=1; unset s;;
1) beer="No more"; one=it;;
"No more") beer=99; return 1;;
*) ((--beer));;
esac
}
next() {
step ${beer:=$(($1+1))}
refrain |
dd if=/dev/stdin of=$0 seek=$(grep -bom1 ^next\ $0 | cut -f1 -d:) bs=1 conv=notrunc 2>/dev/null
}
refrain() {
printf "%-17s\n" "# $beer bottles"
echo echo ${beer:-No more} bottle$s of beer on the wall, ${beer:-No more} bottle$s of beer.
if step; then
echo echo Take $one down, pass it around, $beer bottle$s of beer on the wall.
echo echo
echo next abcdefghijkl
else
echo echo Go to the store, buy some more, $beer bottle$s of beer on the wall.
fi
}
####
next ${1:-99} #