মূল শেল প্রক্রিয়াটির প্রায় অভিন্ন অনুলিপি হিসাবে একটি সাবশেল শুরু হয়। হুডের নীচে, শেলটি fork
সিস্টেম কলকে 1 কল করে , যা একটি নতুন প্রক্রিয়া তৈরি করে যার কোড এবং মেমরির অনুলিপি 2 । সাবশেলটি তৈরি করা হলে, এটির এবং এর পিতামাতার মধ্যে খুব কম পার্থক্য রয়েছে। বিশেষত, তাদের একই ভেরিয়েবল রয়েছে। এমনকি $$
বিশেষ ভেরিয়েবল একই মান সাবশেলে রাখে: এটি আসল শেলের প্রক্রিয়া আইডি। একইভাবে $PPID
মূল শেলের পিতামাতার পিআইডি।
কয়েকটি শেল সাবশেলে কয়েকটি ভেরিয়েবল পরিবর্তন করে। বাশ BASHPID
শেল প্রক্রিয়াটির পিআইডি সেট করে, যা সাবশেলে পরিবর্তিত হয়। বাশ, জেডএস এবং ম্যাক্স পিতামাতার এবং সাব-শ্যালে $RANDOM
বিভিন্ন মান অর্জনের ব্যবস্থা করে। তবে এর মতো অন্তর্নির্মিত বিশেষ ক্ষেত্রেগুলি বাদে, সমস্ত ভেরিয়েবলের মূল শেল, একই রফতানির স্থিতি, একই পঠন-স্থিতি ইত্যাদির মতো সাবশেলে একই মান থাকে All সমস্ত ফাংশন সংজ্ঞা, ওরফে সংজ্ঞা, শেল অপশন এবং অন্যান্য সেটিংসও উত্তরাধিকার সূত্রে প্রাপ্ত।
তৈরি করা একটি সাবশেলে (…)
এর নির্মাতার মতো একই ফাইল বর্ণনাকারী রয়েছে। সাবসেল তৈরির কিছু অন্যান্য উপায় ব্যবহারকারী কোড কার্যকর করার আগে কিছু ফাইল বর্ণনাকারী সংশোধন করে; উদাহরণস্বরূপ, পাইপের বাম-হাতের অংশটি পাইপের সাথে সংযুক্ত স্ট্যান্ডার্ড আউটপুট সহ একটি সাব-শেল 3 এ চলে । Subshell একই বর্তমান ডিরেক্টরী, একই সংকেত মাস্ক ইত্যাদি কয়েক ব্যতিক্রম হল যে subshells কাস্টম যাত্রীর সঙ্গের নিজলটবহর উত্তরাধিকারী না দিয়ে শুরু হয়: উপেক্ষিত সংকেত ( এমন) subshell উপেক্ষা, কিন্তু অন্যান্য যাত্রীর সঙ্গের নিজলটবহর ( সংকেত ) রিসেট হয় ডিফল্ট ক্রিয়া 4 ।trap '' SIGNAL
trap CODE
একটি সাবস্কেল এইভাবে স্ক্রিপ্ট চালানো থেকে পৃথক। একটি স্ক্রিপ্ট একটি পৃথক প্রোগ্রাম। এই পৃথক প্রোগ্রামটি কাকতালীয়ভাবে স্ক্রিপ্টও হতে পারে যা অভিভাবকের মতো একই দোভাষী দ্বারা সম্পাদিত হয়, তবে এই কাকতালীয়ভাবে পৃথক প্রোগ্রামটিকে পিতামাতার অভ্যন্তরীণ ডেটা সম্পর্কিত কোনও বিশেষ দৃশ্যমানতা দেয় না। অ-রফতানি ভেরিয়েবলগুলি হ'ল অভ্যন্তরীণ ডেটা, সুতরাং যখন শিশু শেল স্ক্রিপ্টের জন্য অনুবাদককে কার্যকর করা হয় , তখন এই ভেরিয়েবলগুলি দেখতে পায় না। এক্সপোর্টেড ভেরিয়েবলগুলি, অর্থাৎ এনভায়রনমেন্ট ভেরিয়েবলগুলি এক্সিকিউটড প্রোগ্রামগুলিতে সঞ্চারিত হয়।
এভাবে:
x=1
(echo $x)
মুদ্রণ করা হয় 1
কারণ সাবশেল এটি তৈরি হওয়া শেলের একটি প্রতিলিপি।
x=1
sh -c 'echo $x'
একটি শেল সন্তান প্রক্রিয়া হিসেবে একটি শেল চালানোর জন্য ঘটে, কিন্তু x
দ্বিতীয় লাইন সঙ্গে আর সংযোগ আছে x
তুলনায় দ্বিতীয় লাইনে
x=1
perl -le 'print $x'
অথবা
x=1
python -c 'print x'
1 একটি ব্যতিক্রম ksh93
শেল যেখানে কাঁটাচামচটি অপ্টিমাইজ করা হয় এবং এর বেশিরভাগ পার্শ্ব প্রতিক্রিয়াগুলি অনুকরণ করা হয়।
2 শব্দার্থকভাবে, তারা অনুলিপি। বাস্তবায়নের দৃষ্টিকোণ থেকে, অনেকগুলি ভাগ করে নেওয়া চলছে।
3 ডান হাতের জন্য, এটি শেলের উপর নির্ভর করে।
4 আপনি যদি এটি পরীক্ষা করে দেখেন তবে মনে রাখবেন যে এর মতো জিনিসগুলি$(trap)
মূল শেলের ফাঁদগুলি রিপোর্ট করতে পারে। আরও লক্ষ করুন যে অনেকগুলি শেলের ফাঁদে জড়িত কর্নার ক্ষেত্রে বাগ রয়েছে। উদাহরণস্বরূপ নিনজালজ নোট করেছেন যে ৪.৩ বাশ হিসাবে, "দুটি সাবসেল" ক্ষেত্রে নেস্টেড সাবশেল থেকে ট্র্যাপ bash -x -c 'trap "echo ERR at \$BASH_SUBSHELL \$BASHPID" ERR; set -E; false; echo one subshell; (false); echo two subshells; ( (false) )'
চালায় ERR
, তবে ERR
মধ্যবর্তী সাবশেল থেকে ট্র্যাপটি নয় - set -E
বিকল্পটি প্রচার করতে হবেERR
সমস্ত সাবશેলে ট্র্যাপ করা কিন্তু অন্তর্বর্তী সাব-শেল দূরে অপ্টিমাইজ করা হয়েছে এবং তাই এর ERR
ফাঁদটি চালানোর জন্য নেই ।
x=out; (x=in; echo $x)
)