একটি শেল একটি শিশু শেল হিসাবে একই জিনিস


11

এই দুটি নাম রয়েছে: একটি সাবশেল এবং একটি শিশু-শেল

হ্যাঁ, এর মধ্যে যে কোনও একটি দ্বারা শিশু প্রক্রিয়া শুরু হবে:

sh -c 'echo "Hello"'
( echo "hello" )
echo "$(echo "hello")
echo "hello" | cat

সব কি সমান এবং একই নাম ভাগ? সবাই কি একই সম্পত্তি ভাগ করে নেবে?


পসিক্সের এই সংজ্ঞা রয়েছে :

একটি শেল এক্সিকিউশন পরিবেশ গঠিত ...

তবে উপরের লিঙ্কের শেষ অনুচ্ছেদে এটি রয়েছে:

শেল পরিবেশের সদৃশ হিসাবে একটি সাব-শেল এনভায়রনমেন্ট তৈরি করা হবে that সিগন্যাল ফাঁদগুলি যে উপেক্ষা করা হচ্ছে না সেগুলি ব্যতীত ডিফল্ট ক্রিয়ায় সেট করা হবে।

এবং বিশেষভাবে:

কমান্ড প্রতিস্থাপন, প্রথম বন্ধনীগুলির সাথে গোষ্ঠীযুক্ত কমান্ডগুলি এবং অ্যাসিনক্রোনাস তালিকাগুলি একটি সাব-শেল পরিবেশে কার্যকর করা হবে। অতিরিক্তভাবে, মাল্টি-কমান্ড পাইপলাইনের প্রতিটি কমান্ড সাব-শেল পরিবেশে থাকে; ....

sh -c 'echo "Hello"'সেখানে অন্তর্ভুক্ত করা হয় না যে একটি subshell বলা যায়?

উত্তর:


14

একটি সাব- শেল বিদ্যমান শেলটিকে সদৃশ করে। এর একই ভেরিয়েবলগুলি রয়েছে - একই ফাংশনগুলি, একই অপশনগুলি ইত্যাদি the হুডের নীচে forkসিস্টেম কল-এর সাহায্যে একটি সাব-শেল তৈরি করা হয়; সন্তানের প্রক্রিয়া তার প্রত্যাশিত যা করা হয় তা চালিয়ে যায়, যখন পিতা-মাতা অপেক্ষা করে (যেমন, $(…)) বা তার জীবন (যেমন, … &) বা অন্যথায় যা প্রত্যাশিত হয় তা করে (যেমন, … | …)।

sh -c …একটি সাব-শেল তৈরি করে না। এটি আরেকটি প্রোগ্রাম চালু করে। এই প্রোগ্রামটি একটি শেল হতে পারে, তবে এটি কেবল একটি কাকতালীয় ঘটনা। প্রোগ্রামটি এমনকি একটি পৃথক শেলও হতে পারে (যেমন, আপনি যদি sh -c …ব্যাশ থেকে চালান , এবং shড্যাশ হয়), অর্থাত্ একটি সম্পূর্ণ ভিন্ন প্রোগ্রাম যা কেবল তার আচরণে উল্লেখযোগ্য মিল রয়েছে to হুডের নীচে, একটি বাহ্যিক কমান্ড ( shবা অন্য কোনও) চালু করে forkসিস্টেম কল এবং তারপরে অন্য প্রোগ্রামের (এখানে ) সাব-প্রসেসে শেল প্রোগ্রামটি প্রতিস্থাপনেরexecve জন্য সিস্টেম কল কল করে ।sh

B অন্তর্ভুক্ত $$, তবে কিছু শেল-নির্দিষ্ট ভেরিয়েবল বাদে যেমন বাশ এবং ম্যাক্স BASHPID
Least কমপক্ষে, এটি traditionalতিহ্যবাহী এবং স্বাভাবিক বাস্তবায়ন। শেলগুলি কাঁটাচামচকে অপ্টিমাইজ করতে পারে যদি তারা অন্যথায় আচরণের নকল করতে পারে।

প্রাসঙ্গিক ম্যান পৃষ্ঠাগুলি: কাঁটাচামচ (2) , সম্পাদন (2)


ধন্যবাদ। বাশ শেবাং দিয়ে বাশ স্ক্রিপ্ট চালানো কোনটির সাথে সম্পর্কিত?
টিম

@ টিম একই জিনিস sh -c: এটি একটি সাবপ্রসেস যা কাকতালীয়ভাবে একটি শেল হয়ে থাকে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

(১) "একটি বাহ্যিক কমান্ড (sh বা অন্য কোনও) প্রবর্তন করে কাঁটাচামচ কল কল করে এবং তারপরে অন্য প্রোগ্রামের (এখানে sh) দ্বারা সাবপ্রসেসে শেল প্রোগ্রামটি প্রতিস্থাপনের জন্য এক্সপ্লাইভ সিস্টেম কল প্রয়োগ করা হয়" " এটি কি ঠিক যে কাঁটাচামচি প্রথমে একটি সাব-শেল তৈরি করে এবং তারপরে বাহ্যিক প্রোগ্রামের সাথে সাব-শেলটি প্রতিস্থাপন করে? সুতরাং আপনার জবাব দুটি ক্ষেত্রে, একটি সাবস্কেল সর্বদা তৈরি করা হয়? (2) "একটি শেসেল যা বিদ্যমান শেলটিকে সদৃশ করে।" ওটার মানে কি?
টিম

(3) মধ্যে bash -c <command>, শেলটি কাঁটাচামচ করার পরে এবং তারপরে কার্যকর করা হয় bash -c <command>, একটি ব্যাশ শেল তৈরি করা হয়। তারপরে আবার কি সিস্টেম কলটি <command>ব্যাশ শেলের কাঁটাচামচ চালানো এবং সম্পাদন করতে ব্যবহৃত হয় <command>?
টিম

2
@ কুওগলম "চাইল্ড শেল" একটি নির্দিষ্ট অর্থ সহ প্রযুক্তিগত শব্দ নয়, "সাবশেল" এর বিপরীতে। যদি এটি একটি শাঁস যা একটি শিশু, তবে এটি ইংলিশের নিয়মাবলী অনুসরণ করে চাইল্ড শেল।
গিলস

1

একটি সাব-শেল পরিবেশের একটি পৃথক প্রক্রিয়াতে বেঁচে থাকার দরকার নেই, এটি কেবলমাত্র বর্তমান কার্যকর পরিবেশের সদৃশ করতে হবে। এটি কল করে না এমন ksh93একটি virtual sub-shellপ্রক্রিয়া দ্বারা সম্পন্ন হয় fork()। এটা তৈরি করে মত সেকেলে প্ল্যাটফর্মের উপর খুব দ্রুত ksh93 Win-DOS, যেমন Win-DOSforking সঙ্গে অত্যন্ত ধীর।

sh -c cmd অন্যদিকে ডিফল্ট শেল দিয়ে একটি নতুন প্রক্রিয়া তৈরি করে যা আপনার বর্তমান ইন্টারেক্টিভ শেলের মতো হওয়ার দরকার নেই।

এমনকি যখন shএবং আপনার বর্তমান শেলটি অভিন্ন, এটি কার্যকরকরণের পরিবেশটিকে সদৃশ করে না এবং এটি একটি তৈরি করে না sub-shell


সুতরাং, অন্যান্য শেলগুলিতে বাদে ksh93সাব শেল কি চাইল্ড শেল ঠিক আছে?
cuonglm

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