বাশ এমনকি পার্স / রান স্টাফ পরিবেশে পরিবর্তনশীল কেন রাখে?


9

ShellShock ব্যাশ মধ্যে বাগ এনভায়রনমেন্ট ভেরিয়েবল প্রণালী দ্বারা কাজ করে। সত্যিই আমি এইরকম বৈশিষ্ট্য রয়েছে যে দেখে অবাক হয়েছি:

"এনভি ভার্সের মাধ্যমে ফাংশন সংজ্ঞা প্রদান করা"

সুতরাং এই প্রশ্নটি সম্ভবত নিখুঁতভাবে তৈরি না করা একটি উদাহরণ বা এমন কোনও ক্ষেত্রে জিজ্ঞাসা করা উচিত যেখানে এই বৈশিষ্ট্যটি থাকা দরকার?

বোনাস. অন্যান্য শেলগুলি zsh, ড্যাশ ইত্যাদিতেও কি এই বৈশিষ্ট্য রয়েছে?


এটি ফাংশন সংজ্ঞা পাস করতে এনভ ভার্স ব্যবহার করে। "কেন এটি কেবল পরিবেশের পরিবর্তনশীলগুলিকে উপলব্ধ / অ্যাক্সেসযোগ্য রাখে না?" এর অর্থ কী? ?
অ্যান্থন

@ অ্যানটন মন্তব্যের জন্য ধন্যবাদ। হতে পারে আমার স্পষ্ট হওয়া উচিত এবং এটিকে পুনরায় জবাবদিহি করা উচিত। এনভ ভার্সের মাধ্যমে কোন কারণে ফাংশন সংজ্ঞা পাস করতে সক্ষম হওয়া প্রয়োজন?
humanityANDpeace

1
আমি ১০০% নিশ্চিত নই তবে আমি মনে করি যে জিএনইউ parallelযদি ফাংশন সংজ্ঞা বিতরণ করে তবে এটি একাধিক বাশ উদাহরণ উপস্থাপন করে। যদি সেভাবে না হয় তবে একটি ফাইলের মধ্যে এটি লিখতে হবে, যা প্রতিটি আহ্বানযুক্ত উদাহরণটি পড়ে এবং তারপরে আপনাকে সেই ফাইলটি কখন সরিয়ে ফেলা যায় সে সম্পর্কিত সমস্যার সমাধান করতে হবে।
অ্যান্থন

2
এই থ্রেডটির কিছু ইতিহাস রয়েছে। রফতানি ফাংশনগুলি যদিও উন্মাদ হয় । আপনি যদি পুরানো শেল এক্সিকিউটেবল কমান্ডের উত্তরাধিকারী হয়ে একটি নতুন শেল চান তবে আপনি .dotএকই ফাইলটি পুরানো শেলটি করেছেন। কীভাবে এটি সম্পন্ন হয় তা - এবং এটি অর্থবোধ করে - বা execইনগ করার সময় আপনি নতুন শেল ফাইলটিকে ইনপুট হিসাবে খাওয়ান । একবার এটি পড়ার পরে ফাইলটি কার্নেল দ্বারা যে কোনওভাবে ক্যাশে করা হয়।
মাইকজার্ভ

@ মিমক্জার্ভস কি আমি এটি সঠিকভাবে বুঝতে পারি যে শেলশকের একটি বড় অংশ এই বৈশিষ্ট্যের সাথে সম্পর্কিত যা এটি এখনও এতটা প্রয়োজনীয় নয়?
humanityANDpeace

উত্তর:


4

যখন কোনও স্ক্রিপ্ট অন্য স্ক্রিপ্টের অনুরোধ করে, তখন মূল স্ক্রিপ্টের ভেরিয়েবলগুলি রফতানি করা যায় এবং তারপরে সেগুলি শিশু স্ক্রিপ্টে দৃশ্যমান হবে। রফতানির কাজগুলি একটি সুস্পষ্ট সাধারণীকরণ: পিতামাতার কাছ থেকে ফাংশনটি রফতানি করুন, এটি সন্তানের মধ্যে দৃশ্যমান করুন।

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

এনভায়রনমেন্ট ভেরিয়েবলের নাম হিসাবে ফাংশনটির নামটি ব্যবহার করা পছন্দ একটি অদ্ভুত। এক কিছুর জন্য, এর অর্থ হ'ল একটি রফতানি পরিবর্তনশীল একই নামের রফতানি ফাংশনের সাথে সংঘর্ষ হয়।

এক্সপোর্ট করা ফাংশনগুলি একটি পুরানো বৈশিষ্ট্য। এসভিআর 2 তে বোর্ন শেলটিতে ফাংশনগুলি যুক্ত করা হয়েছিল এবং একই বছর (1984) প্রকাশিত সংস্করণ 8 শেলের রফতানি করা ক্রিয়াকলাপগুলি । সেই শেলটিতে, ভেরিয়েবল এবং ফাংশনগুলি একই নেমস্পেস ব্যবহার করে। আমি জানি না কীভাবে ফাংশন রফতানি কাজ করেছিল। Heirloom শেল একটি বোর্ন বৈকল্পিক যা ফাংশন আছে কিন্তু তাদের রপ্তানি না উপর ভিত্তি করে।

এটিটি কেএসআই অনুমান করে রফতানি করা কার্যগুলি সমর্থন করে তবে উত্সের দিকে তাকানো বা এটির সাথে খেলে আমি দেখতে পাচ্ছি না যে এটি কাজ করে, ksh93u হিসাবে as

env -i /usr/bin/ksh -c 'f=variable; f () { echo function; }; typeset -fx f; /usr/bin/env; ksh -c f'
_=*25182*/usr/bin/env
PWD=/home/gilles
SHLVL=1
A__z="*SHLVL
ksh: f: not found

Ksh এর সর্বজনীন ডোমেন ক্লোনস (pdksh, mksh), ড্যাশ এবং zsh রফতানি কার্য সমর্থন করে না।


1
ধন্যবাদ! সুতরাং, রফতানি না করে বৈশিষ্ট্যটির কার্যকারিতা নষ্ট হয়ে যায়, তবুও কিছু শেল যেমন ড্যাশ, জেডএস এবং পিডিএক্স ইত্যাদি রয়েছে যা এই চমকপ্রদতার অভাব রয়েছে, আমি কি এই অধিকারটি পড়ছি?
humanityANDpeace

তবে আমি যখন ব্যাশে কোনও ফাংশন রফতানি করি তখন এটি একটি ভেরিয়েবলে যায় BASH_FUNC_f%%=() { echo hi }। বাশ কেন অন্যান্য পরিবেশের পরিবর্তনকে পার্স করবে? BASH_FUNC_g%%যখন আমি কেবল কল করছি তখন কেন এটি বিশদ হবে f? (স্পষ্টতই, প্রাক শেলশক, পরিবেশের পরিবর্তনশীলকে সবেমাত্র ডাকা হয়েছিল fবা g- তবে আমি এখনও ভাবছি যে gআমি gযদি আমার স্ক্রিপ্টে কখনও কল না করি তবে কেন পার্স করা হত)
রূপান্তরিত

@ মেট এটি ফাংশন সংজ্ঞা কোনটি তা নির্ধারণ করতে সমস্ত পরিবেশের ভেরিয়েবলগুলি দেখতে হবে। এটি সেই সত্যটি মুখস্থ করতে পারে এবং প্রথম বার প্রয়োজন হওয়া পর্যন্ত কোনও ফাংশনের কোড পার্স করা এড়াতে পারে, তবে এটি খুব অল্প লাভের জন্য অতিরিক্ত জটিলতা হবে। কেবলমাত্র এক ধরণের ফাংশন থাকা সহজ এবং দুটি নয় ("সাধারণ ফাংশন" এবং "পরিবেশের পরিবর্তনশীল থেকে কিছু পার্সিংয়ের প্রয়োজন" থেকে ফাংশন ")।
গিলস 'অশুভ হওয়া বন্ধ করুন'

পরিষ্কার না. আমি প্রস্তাব দিচ্ছি যে স্পষ্টতই কাজটি করার দরকার ছিল, যখন আমি কিছু কল করি f, (1) শেল ফাংশন fযাচাই করা, (2) পরিবেশিত ভেরিয়েবলের জন্য পরীক্ষা fকরুন, এবং এটি বিশ্লেষণ করার চেষ্টা করুন (3) চেক PATHএকটি এক্সিকিউটেবল কল জন্য প্রতিটি উপাদান f। শেল প্রারম্ভকালে শেল কোড হিসাবে প্রতিটি পরিবেশের পরিবর্তনশীলকে পার্সিং কীভাবে কম জটিল ডিজাইনের মতো মনে হতে পারে?
রূপক

@ মেটামোরফিক আপনি আরও একটি পদক্ষেপ যুক্ত করার পরামর্শ দিচ্ছেন যা প্রতিটি কমান্ডের সাথে আবশ্যক। ফাংশন তালিকাভুক্ত করার সময় (অন্যদিকে পরিবেশে আর unset -f fooকোনও কার্যকারিতা সংজ্ঞাটি অনুসন্ধান করা উচিত নয়) ফাংশনগুলি সংজ্ঞায়িত বা অপরিবর্তিত করার সময় আপনাকে আরও একটি পদক্ষেপ যুক্ত করতে হবে foo( declare -fসমস্ত পরিবেশের ভেরিয়েবলগুলি পড়া ছাড়া আপনি কীভাবে হ্যান্ডেল করবেন ?) , এবং অন্য যা কিছু আমি ভাবছি না। আপনার নকশাটি কেবল সহজ বলে মনে হচ্ছে কারণ আপনি এর বেশিরভাগ অংশ রেখে গেছেন। বিপরীতে, প্রারম্ভকালে সমস্ত কিছু করা কোডের একক টুকরো এবং তারপরে সবকিছু ঠিক কাজ করে।
গিলস 'অশুভ হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.