পসিক্স পরিভাষায় শেল এক্সিকিউশন এনভায়রনমেন্টের ধারণার সাথে একটি সাব- শেল পরিবেশ যুক্ত হয় ।
একটি সাব-শেল এনভায়রনমেন্ট একটি পৃথক শেল এক্সিকিউশন এনভায়রনমেন্ট যা প্যারেন্ট এনভায়রনমেন্টের সদৃশ হিসাবে তৈরি করা হয়। এই কার্যকরকরণের পরিবেশে খোলা ফাইল, উমাস্ক, ওয়ার্কিং ডিরেক্টরি, শেল ভেরিয়েবল / ফাংশন / উপকরণগুলি যেমন ...
সেই সাবশেল পরিবেশে পরিবর্তনগুলি পিতামাতার পরিবেশকে প্রভাবিত করে না।
Ditionতিহ্যগতভাবে বোর্ন শেল বা ksh88 এ যার উপর পসিক্স স্পেসিফিকেশন ভিত্তিক, এটি একটি শিশু প্রক্রিয়া জাল করেই করা হয়েছিল।
পসিক্স যে ক্ষেত্রগুলিতে সাব-শেল পরিবেশে কমান্ড চালানোর জন্য প্রয়োজনীয় বা কমান্ডের অনুমতি দেয় সেগুলি হ'ল traditionতিহ্যগতভাবে ksh88 একটি শিশু শেল প্রক্রিয়াটিকে কাঁটাচামচ করেছে।
এটি বাস্তবায়নের জন্য এটির জন্য শিশু প্রক্রিয়াটি ব্যবহার করতে বাধ্য করে না।
কোনও শেল তার পরিবর্তে যেভাবে পৃথক কার্যকর পরিবেশটি পছন্দ করতে পারে তা বেছে নিতে পারে।
উদাহরণস্বরূপ, ksh93 এটি প্যারেন্ট এক্সিকিউশন এনভায়রনমেন্টের বৈশিষ্ট্যগুলি সংরক্ষণ করে এবং প্রাসঙ্গিক পরিবেশগুলিতে যেখানে কাঁটাচামচ এড়ানো যেতে পারে সেগুলি বন্ধ করার পরে তাদের পুনরুদ্ধার করে (বেশিরভাগ সিস্টেমে কাঁটাচামচ করা যেমন একটি ব্যয়বহুল হিসাবে ব্যয় হয়) does
উদাহরণস্বরূপ, এতে:
cd /foo; pwd
(cd /bar; pwd)
pwd
পসিক্সের cd /foo
জন্য আলাদা পরিবেশে চালিত হওয়া এবং এরকম কিছু আউটপুট চালানো দরকার:
/foo
/bar
/foo
এটি একটি পৃথক প্রক্রিয়া চালানোর প্রয়োজন হয় না। উদাহরণস্বরূপ, stdout একটি ভাঙ্গা পাইপ হয়ে ওঠে, pwd
সাব-শেল পরিবেশে চালানো খুব ভালভাবে একটি এবং কেবল শেল প্রক্রিয়াতে প্রেরণ করা যেতে পারে the
বেশিরভাগ শেলগুলি শিশু প্রসেসের bash
অভ্যন্তরে কোডটি মূল্যায়ন করে এটি প্রয়োগ করবে (...)
(পিতামাতার প্রক্রিয়াটি সমাপ্তির অপেক্ষায় রয়েছে), তবে ksh93 পরিবর্তে কোডটি ভিতরে চালানোর পরে (...)
সমস্ত একই প্রক্রিয়াতে শুরু করবে:
- মনে রাখবেন এটি একটি সাব-শেল পরিবেশে।
- উপরে
cd
, পূর্ববর্তী কাজের ডিরেক্টরির (সাধারণত একটি ফাইল বর্ণনাকারী O_CLOEXEC দিয়ে খোলা দিকে), OLDPWD মূল্য গণপূর্ত ভেরিয়েবল এবং কিছু সংরক্ষণ যে সংরক্ষণ cd
সংশোধন পারে এবং তারপর কিchdir("/bar")
- সাব-শেল থেকে ফিরে আসার পরে, বর্তমানের ডিরেক্টরিটি পুনরুদ্ধার করা হয়েছে (
fchdir()
সেইভ করা এফডি সহ একটি ), এবং সাব-শেল সংশোধিত হতে পারে এমন সমস্ত কিছু।
এমন প্রসঙ্গ রয়েছে যেখানে একটি শিশু প্রক্রিয়া এড়ানো যায় না। ksh93 কাঁটাচামচ করে না:
var=$(subshell)
(subshell)
কিন্তু না
{ subshell; } &
{ subshell; } | other command
এটি হল, যেসব ক্ষেত্রে বিষয়গুলিকে পৃথক প্রক্রিয়াতে চালিত করতে হয় তাই তারা একযোগে চলতে পারে।
ksh93 অপটিমাইজেশন এর চেয়ে আরও বেশি এগিয়ে যায়। উদাহরণস্বরূপ, ভিতরে থাকাকালীন
var=$(pwd)
বেশিরভাগ শেলগুলি একটি প্রক্রিয়া কাঁটাবে, শিশুটি pwd
তার স্টাডআউট দিয়ে একটি পাইপে পুনঃনির্দেশিত করে কমান্ডটি চালাবে, সেই পাইপটিতে pwd
বর্তমান ওয়ার্কিং ডিরেক্টরিটি লিখবে, এবং পিতামাতার প্রক্রিয়াটি পাইপের অন্য প্রান্তে ফলাফলটি পড়বে, ksh93
সমস্ত কিছু দ্বারা ভার্চুয়ালাইজ করবে কাঁটাচামচ বা পাইপ প্রয়োজন। একটি কাঁটাচামচ এবং পাইপ কেবল অন্তর্নির্মিত কমান্ডের জন্য ব্যবহৃত হত।
মনে রাখবেন যে এমন অন্যান্য প্রসঙ্গ রয়েছে যেগুলি শেলগুলি একটি শিশু প্রক্রিয়া তৈরি করে subs উদাহরণস্বরূপ, একটি পৃথক এক্সিকিউটেবল (এবং এটি একই শেল ইন্টারপ্রেটারের জন্য নির্মিত কোনও স্ক্রিপ্ট নয়) কমান্ড চালাতে শেলকে সেই কমান্ডটি চালানোর জন্য কোনও প্রক্রিয়া তৈরি করতে হবে অন্যথায় এটি হবে না কমান্ড ফিরে আসার পরে আরও কমান্ড চালাতে সক্ষম।
ভিতরে:
/bin/echo "$((n += 1))"
এটি সাবসেল নয়, কমান্ডটি বর্তমান শেল এক্সিকিউশন এনভায়রনমেন্টে মূল্যায়ন করা হবে, বর্তমান শেল এক্সিকিউশন পরিবেশের n
পরিবর্তনশীল বৃদ্ধি করা হবে, তবে শেলটি একটি শিশু প্রক্রিয়াটিকে যুক্তি হিসাবে /bin/echo
প্রসারিত করে সেই আদেশটি সম্পাদন করতে বাধ্য করবে $((n += 1))
।
অনেকগুলি শেল একটি অপ্টিমাইজেশন প্রয়োগ করে যাতে তারা কোনও শিশু প্রক্রিয়াটিকে বাহ্যিক কমান্ডটি চালানোর জন্য চাপ দেয় না যদি এটি কোনও স্ক্রিপ্ট বা সাবশেলের শেষ কমান্ড হয় (সেই শিশুদের জন্য যেগুলি শিশু প্রক্রিয়া হিসাবে প্রয়োগ করা হয়)। ( bash
তবে কেবলমাত্র যদি সেই আদেশটি সাবসেলের একমাত্র কমান্ড হয়) it
এর অর্থ কী, সেই শেলগুলির সাথে, যদি সাব-শেলের শেষ কমান্ডটি একটি বাহ্যিক আদেশ হয় তবে সাবশেল কোনও অতিরিক্ত প্রক্রিয়া তৈরি করার কারণ ঘটায় না। যদি আপনি তুলনা করেন:
a=1; /bin/echo "$a"; a=2; /bin/echo "$a"
সঙ্গে
a=1; /bin/echo "$a"; (a=2; /bin/echo "$a")
সেখানে একই সংখ্যক প্রক্রিয়া তৈরি হবে, কেবলমাত্র দ্বিতীয় ক্ষেত্রে, দ্বিতীয় কাঁটা আগে করা হয় যাতে এটি a=2
একটি সাব-শেল পরিবেশে চালানো হয়।