পসিক্স শেলগুলিতে ফাংশন এবং ভেরিয়েবলের জন্য নেমস্পেসগুলি পৃথক করুন


13

ড্যাশগুলিতে, ফাংশন এবং ভেরিয়েবলগুলি পৃথক নেমস্পেসে বাস করতে প্রদর্শিত হয়:

fn(){
    fn="hello world"
}
fn; echo "The value is $fn!" #prints: The value is hello world!
fn; echo "The value is $fn!" #prints: The value is hello world!
#the fn variable doesn't conflict with the fn function

এটি কোনও ড্যাশ-নির্দিষ্ট বৈশিষ্ট্য বা কোনও পসিক্স গ্যারান্টি?


2
আপনার কোডটি আসলে প্রমাণ করে না যে fnফাংশনটি একটি পৃথক নেমস্পেসে রয়েছে; যদি এটি কার্যকর করে একবার তার সংজ্ঞাটি মুছে ফেলা হয়, আমরা ঠিক একই আচরণ দেখতে চাই। আপনার দেখানো উচিত যে ফাংশনটি এখনও সংজ্ঞায়িত রয়েছে, উদাহরণস্বরূপ type fnপরে।
Alexis

উত্তর:


13

একটি গ্যারান্টি :

2.9.5 ফাংশন সংজ্ঞা কমান্ড

একটি ফাংশন একটি ব্যবহারকারী-সংজ্ঞায়িত নাম যা নতুন অবস্থানগত পরামিতিগুলির সাথে যৌগিক কমান্ড কল করতে একটি সাধারণ কমান্ড হিসাবে ব্যবহৃত হয়। একটি ফাংশন একটি "ফাংশন সংজ্ঞা কমান্ড" দিয়ে সংজ্ঞায়িত করা হয়। [...]

ফাংশনটির নাম রাখা হয়েছে নাম; অ্যাপ্লিকেশনটি নিশ্চিত করবে যে এটি একটি নাম (এক্সবিডি নাম দেখুন) এবং এটি কোনও বিশেষ অন্তর্নির্মিত ইউটিলিটির নাম নয়। একটি বাস্তবায়ন এক্সটেনশন হিসাবে কোনও ফাংশন নামের অন্যান্য অক্ষরকে মঞ্জুরি দিতে পারে। প্রয়োগটি ফাংশন এবং ভেরিয়েবলের জন্য পৃথক নামের স্থান বজায় রাখে।


এছাড়াও মনে রাখবেন unsetহয়েছে -vএবং -fপ্রদত্ত নাম দ্বারা পরিবর্তনশীল বা ফাংশন unsetting মধ্যে পছন্দ করে নিন। bash(যেমন অন্যান্য অধিকাংশ শাঁস থেকে ভিন্ন) আনসেট হবে foo ফাংশন সঙ্গে unset fooযদি কোন ব্যাপার fooপরিবর্তনশীল একটি আচরণ POSIX দ্বারা অনুমোদিত (!)। এই কারণেই পসিক্স স্ক্রিপ্টগুলিতে সর্বদা হয় -vবা -f(এবং অবশ্যই bashস্ক্রিপ্টগুলিতেও ব্যবহার করা ভাল অভ্যাস) তবে নোট করুন যে unsetভেরিয়েবলটি সর্বদা আনসেট নাও করতে পারে bash, bashভেরিয়েবল স্কোপিংয়ে বেশ কয়েকটি সমস্যা রয়েছে)।
স্টাফেন চেজেলাস

মনে রাখবেন যে প্রাক শেলশক ব্যাশে, কোনও প্রদত্ত নাম অনুসারে ভেরিয়েবল এবং ফাংশন উভয়ই রফতান করার ক্ষেত্রে আপনার সমস্যা হতে পারে, কারণ ব্যাশ উভয়ের জন্য একই পরিবেশের পরিবর্তনশীল নামটি ব্যবহার করে শেষ হবে (পরিবেশে এটি দু'বার রাখলে কিছু কমান্ড মুছে ফেলতে পারে এর মধ্যে একটি)
স্টাফেন চেজেলাস

8

ভেরিয়েবল এবং ফাংশনগুলি ড্যাশগুলিতে বিভিন্ন নেমস্পেসে থাকে এবং এটি পসিএক্সও নির্দিষ্ট করে :

প্রয়োগটি ফাংশন এবং ভেরিয়েবলের পৃথক নামের স্থান বজায় রাখে।

এগুলি ছাড়াও, ভেরিয়েবলের ডিফল্টরূপে বিশ্বব্যাপী সুযোগ থাকে। কিছু শেল (যেমন বাশ, ksh এবং zsh) localকেবল স্থানীয় স্কোপ সহ কোনও ফাংশনে ভেরিয়েবলগুলি ঘোষণার জন্য কীওয়ার্ড সরবরাহ করে।

সুতরাং, হ্যাঁ, আপনি যে আচরণটি দেখছেন তা পসিক্সের গ্যারান্টিযুক্ত।

POSIX করেননি আদর্শায়িত local , এখনো :

প্রারম্ভিক প্রস্তাবে ফাংশনগুলির বর্ণনা এই ধারণার উপর ভিত্তি করে ছিল যে ফাংশনগুলি ক্ষুদ্রতর শেল স্ক্রিপ্টগুলির মতো আচরণ করা উচিত; এটি হল, ভেরিয়েবলগুলি ভাগ করে নেওয়া ছাড়া , কার্যকর করা পরিবেশের বেশিরভাগ উপাদানগুলিকে এমন আচরণ করা উচিত যেন তারা একটি নতুন কার্যকর পরিবেশ, [..]

[..] একটি ফাংশনের মধ্যে স্থানীয় ভেরিয়েবলগুলি বিবেচনা করা হত এবং অন্য একটি প্রাথমিক প্রস্তাব (বিশেষ অন্তর্নির্মিত দ্বারা নিয়ন্ত্রিত local) এর অন্তর্ভুক্ত ছিল, তবে তাদের সরিয়ে দেওয়া হয়েছে কারণ তারা ফাংশনগুলির জন্য বিকশিত সাধারণ মডেলটির সাথে খাপ খায় না এবং কারণ এখনও যুক্ত করার বিরোধিতা ছিল আরেকটি নতুন বিশেষ অন্তর্নির্মিত এটি historicalতিহাসিক অনুশীলনের অংশ ছিল না। যদি এই স্ট্যান্ডার্ডের ভবিষ্যতের সংস্করণে এই স্থানীয় পরিবর্তনশীল ব্যবস্থা গ্রহণ করা হয় তবে বাস্তবায়নের ক্ষেত্রে সনাক্তকারী local(পাশাপাশি typesetকর্নশেলের মতো ব্যবহৃত) সংরক্ষণ করা উচিত ।

(জোর আমার)


অ্যাশ (৮০ এর দশকের শেষের দিকে) যার উপর ভিত্তি করে ড্যাশ রয়েছে local, সেখানেও বেশিরভাগ ধারাবাহিক ইন্টারফেস রয়েছে (উদাহরণস্বরূপ ব্যাশে মারাত্মকভাবে ভাঙা একের তুলনায়), ব্যাশ মাত্র সম্প্রতি (৪.৪) ধার নিয়েছে local -(এর জন্য স্থানীয় সুযোগের জন্য বিকল্পগুলি) ছাই থেকে ( $-কেবলমাত্র সেই এক চলকটির জন্য অ্যাশ-স্টাইলের স্কোপিং বাস্তবায়ন করা ) ksh এবং localযশ নেই (কেবলমাত্র pdksh রূপগুলি রয়েছে local), তবে এর typesetপরিবর্তে (ksh93 এ typesetকেবল ksh সিনট্যাক্স ব্যবহার করে ঘোষিত ফাংশনগুলিতে স্থানীয় (স্ট্যাটিক) স্কোপ সরবরাহ করে)।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.