বাশ ফাংশনকে ওভাররাইড হওয়া থেকে কীভাবে রক্ষা করবেন?


13

ইন bashশেল, আমরা একটি ফাংশন নির্ধারণ করতে পারবেন fসঙ্গে

f(){ echo Hello; }

এবং তারপরে কোনও ত্রুটি বা সতর্কতা বার্তা ছাড়াই এটিকে পুনরায় ঘোষিত / ওভাররাইড করুন

f(){ echo Bye; }

আমি বিশ্বাস করি যে ফাংশনগুলিকে এইভাবে ওভাররাইড করা থেকে রক্ষা করার একটি উপায় আছে।


2
ভেরিয়েবল সঙ্গে হিসাবে একই সঙ্গে typeset -r: typeset -rf f
মোশি

3
বাreadonly -f f
মশবির

উত্তর:


25

আপনি বা ( সমতুল্য ) fব্যবহার করে কেবল পঠনযোগ্য ফাংশন হিসাবে ঘোষণা করতে পারেন । এটি এই বিল্ট-ইন ইউটিলিটিগুলির বিকল্প যা এগুলি পরিবর্তকের পরিবর্তে কোনও ফাংশনের নাম হিসাবে কাজ করে ।readonly -f fdeclare -g -r -f freadonlydeclare -g -r-fff

$ f(){ echo Hello; }
$ readonly -f f
$ f(){ echo Bye; }
bash: f: readonly function
$ unset -f f
bash: unset: f: cannot unset: readonly function
$ f
Hello

যেমন আপনি দেখতে পাচ্ছেন, ফাংশনটি কেবল পঠনযোগ্য করে তোলে তা কেবল এটি ওভাররাইড হওয়া থেকে রক্ষা করে না, তবে এটি সেট না করা থেকে রক্ষা করে (সম্পূর্ণরূপে অপসারণ)।


বর্তমানে (যেমন হিসাবে bash-5.0.11), কেবলমাত্র পঠনযোগ্য ফাংশনটি সংশোধন করার চেষ্টা করা যদি কেউ errexitশেল বিকল্প ( set -e) ব্যবহার করে তবে শেলটি শেষ হবে না । bashরক্ষণাবেক্ষণকারী, চেট বলছেন যে এটি একটি তদারকি এবং পরবর্তী প্রকাশের সাথে এটি পরিবর্তন করা হবে।


ওভাররাইড ফাংশনটির প্রচেষ্টা বার্তা bash: f: readonly functionএবং শূন্য-নয় এমন স্থিতি কোড উত্পন্ন করে , তবে errexitবিকল্পটি সক্ষম করা থাকলে প্রস্থান করবেন না ।
kyb

@ কাইব আমি এটিও লক্ষ্য করেছি। আমি নিশ্চিত না যে এটি একটি বাগ ইন bash, তবে আমি bashনিশ্চিত হতে মেইলিং তালিকার একটিতে জিজ্ঞাসা করব।
কুসালানন্দ

ভাল, আপনি যখন এই আচরণ সম্পর্কে নিশ্চিত হন দয়া করে আপনার উত্তর আপডেট করুন।
kyb

1
@ কাইব স্টিফেন চেজেলাস এবং গ্রেগ উওলিউস উভয়ই এই প্রশ্নটির উপর নির্ভরযোগ্য ব্যাখ্যা দিয়েছিলেন। স্টিফেন দাড়ায় যে bashশুধুমাত্র প্রস্থানের যখন set -eকার্যকর হয় যখন POSIX প্রয়োজন তা (এবং readonly -fPOSIX নয়)। গ্রেগ উল্লেখ করেছেন যে bashম্যানুয়ালটিতে কখনই "ফাংশন ঘোষণায় ব্যর্থতা" উল্লেখ করা হয়নি কারণ errexitপ্রস্থানটি ট্রিগার করার কারণ হিসাবে (যদি না কোনও ফাংশন ঘোষণাকে যৌগিক কমান্ড হিসাবে গণনা করা হয়, যা তিনি নিশ্চিত না যে এটি তা করেন না)। থ্রেডটি এখানে চলছে: list.gnu.org/archive/html/help-bash/2019-09/msg00039.html
কুসালানন্দ

@ কাইব আমি আরও লক্ষ্য করছি যে আপনি কখনই errexitবা set -eআপনার প্রশ্নে কিছু বলেন না ।
কুসালানন্দ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.