কেন একটি চক্রের মধ্যে একটি পরিবর্তনশীল দৃশ্যমান?


18

লার্নিং ব্যাশ বুক উল্লেখ করেছে যে একটি সাবশেল কেবল পরিবেশের ভেরিয়েবল এবং ফাইল বর্ণনাকারী ইত্যাদির উত্তরাধিকারী হবে এবং এটি রফতানি না হওয়া ভেরিয়েবলের উত্তরাধিকারী হবে না:

$ var=15
$ (echo $var)
15
$ ./file # this file include the same command echo $var

$

আমি জানি যে শেলটি তার জন্য ()এবং এর জন্য দুটি সাবস্কেল তৈরি করবে ./file, তবে কেন ()ক্ষেত্রে সাবসেল varচলকটি রফতানি না করা সত্ত্বেও এটি ./fileসনাক্ত করতে পারে এবং ক্ষেত্রে এটি সনাক্ত করে না কেন?

# Strace for () 
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f24558b1a10) = 25617
# Strace for ./file
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f24558b1a10) = 25631

আমি ব্যবহার করার চেষ্টা straceকরে উভয় forked প্রক্রিয়া জিনিসটা কিভাবে এই ঘটে আশ্চর্যজনক আমি দেখেছি যে ব্যাশ ক্লোন সিস্টেম কল জন্য একই আর্গুমেন্ট ব্যবহার করবে, তাই এই উপায়ে ()এবং ./fileপিতা বা মাতা একই প্রক্রিয়া অ্যাড্রেস স্পেস থাকতে হবে, তবে কেন মধ্যে ()কেস subshell কাছে দৃশ্যমান varible এবং একই জন্য ঘটবে না ./fileযদিও একই আর্গুমেন্ট ক্লোন সিস্টেম কল উপর ভিত্তি করে তৈরি, কেস?


vinc17 সত্য বলে, এমনকি আপনি সাবস্কেল করার পরেও pstree পাবেন, আপনি এই বিষয়টি বিশ্বাস।
ফার্সিগাল্ফ

উত্তর:


15

লার্নিং ব্যাশ বইটি ভুল। সাবসেলগুলি সমস্ত ভেরিয়েবলের উত্তরাধিকারী। এমনকি $$(মূল শেলের পিআইডি) রাখা হয়। কারণটি হ'ল সাবসেলের জন্য, শেলটি কেবল নতুন শেলটি কাঁটাচামচ করে এবং কার্যকর করে না (বিপরীতে, আপনি টাইপ করার সময় ./fileএকটি নতুন কমান্ড কার্যকর করা হয়, যেমন একটি নতুন শেল; স্ট্রেস আউটপুটে, দেখুন execveএবং অনুরূপ) । সুতরাং, মূলত, এটি কেবল একটি অনুলিপি (কিছু নথিভুক্ত পার্থক্য সহ)।

দ্রষ্টব্য: এটি ব্যাশের সাথে নির্দিষ্ট নয়; এটি কোনও শেলের ক্ষেত্রে সত্য।


ওকি তবে আমি এখন শেলটিতে স্ট্রেস ছাড়ানোর চেষ্টা করেছি এবং আমি ./file চালানোর চেষ্টা করেছি তবে আমি এক্সিকিউটিভের জন্য কোনও কল পাই না এবং সুতরাং ঠিকানার জায়গাগুলি উভয় প্রক্রিয়ার জন্য একই হওয়া উচিত যাতে এটি কীভাবে ব্যাখ্যা করা যায়?
ব্যবহারকারীর 3718463

@ user3718463 আপনি কি বাচ্চাদের সন্ধানের -fবিকল্পটি ব্যবহার করেছেন strace? এক্সিকিউটরের সন্ধান করা দরকার।
ভিঙ্ক 17

হ্যাঁ, আমি এটি অনেক ধন্যবাদ জানলাম, আমি -f বিকল্পটি অনুপস্থিত ছিলাম, এবং তাই আমি
এক্সিকিউটিভ সাইস

16

আপনি বা বইটি একটি শেল যা একটি সাবপ্রসেসের সাথে একটি সাবশেলকে বিভ্রান্ত করছে।

কিছু শেল নির্মাণের ফলে শেল একটি শিশু প্রক্রিয়া জোর করে। লিনাক্সের অধীনে, forkআরও সাধারণ cloneসিস্টেম কলের একটি বিশেষ কেস , যা আপনি straceলগে পর্যবেক্ষণ করেছেন। শিশু শেল স্ক্রিপ্টের একটি অংশ চালায়। শিশু প্রক্রিয়াটিকে সাবসেল বলা হয় । এ জাতীয় সর্বাধিক প্রত্যক্ষ নির্মাণটি হ'ল command1 &: command1একটি সাব-শেলের মধ্যে চলে এবং পরবর্তী কমান্ডগুলি প্যারেন্ট শেলের মধ্যে চলে in অন্যান্য কনস্ট্রাকশন যা সাবসেল তৈরি করে তার মধ্যে হ'ল কমান্ড সাবস্টিটিউশন $(command2)এবং পাইপ command3 | command4( একটি সাবশেলের মধ্যে রান command3, command4বেশিরভাগ শেলগুলিতে সাব-শেইলে চালানো হয় তবে ksh বা zsh তে নয়)।

একটি সাবশেল পিতামাতার প্রক্রিয়াটির একটি অনুলিপি, সুতরাং এতে কেবল একই পরিবেশের পরিবর্তনশীলগুলিই পাওয়া যায় না, একই সাথে সমস্ত একই অভ্যন্তরীণ সংজ্ঞাও রয়েছে: ভেরিয়েবল ( $$মূল শেল প্রক্রিয়াটির প্রসেস আইডি সহ ), ফাংশন, উপকরণ, বিকল্পগুলি ইত্যাদি has সাবশেলে কোড কার্যকর করার আগে, বাশ BASHPIDচাইল্ড প্রক্রিয়াটির প্রসেস আইডিতে ভেরিয়েবল সেট করে ।

আপনি যখন চালান ./file, এটি একটি বাহ্যিক কমান্ড কার্যকর করে। প্রথমে, শেল একটি শিশু প্রক্রিয়া কাঁটাচামচ করে; তারপরে এই শিশু প্রক্রিয়া সম্পাদনযোগ্য ফাইল কার্যকর করে ( execveসিস্টেম কল সহ) ./file। একটি শিশু প্রক্রিয়া তার পিতামাতার প্রক্রিয়া বৈশিষ্ট্যগুলির উত্তরাধিকার সূত্রে প্রাপ্ত হয়: পরিবেশ, বর্তমান ডিরেক্টরি ইত্যাদি execvecall অ্যাপ্লিকেশনটির অভ্যন্তরীণ দিকগুলি কলটিতে হারিয়ে যায় : নন-এক্সপোর্টেড ভেরিয়েবল, ফাংশন, ইত্যাদি বাশ ধারণা যা কার্নেলটি জানে না, এবং বাশ যখন অন্য কোনও প্রোগ্রাম চালায় তখন এগুলি হারিয়ে যায়। এমনকি যদি অন্যান্য প্রোগ্রামটি ব্যাশ স্ক্রিপ্ট হিসাবে ঘটে থাকে তবে এটি বাশের একটি নতুন উদাহরণ দ্বারা সম্পাদিত হয় যা জানে না বা যত্ন করে না যে এর প্যারেন্ট প্রসেসটিও ব্যাশের উদাহরণ হতে পারে। সুতরাং একটি শেল ভেরিয়েবল (অ-রফতানি ভেরিয়েবল) বেঁচে থাকে না execve


এই উত্তরটি আমার জন্য বেশ কয়েকটি জিনিস পরিষ্কার করেছে। কেবলমাত্র আমি বুঝতে পারি না দ্বিতীয় অনুচ্ছেদে এই বাক্যটি: "শিশু শেল স্ক্রিপ্টের একটি অংশ চালায়" " কোন শেল স্ক্রিপ্ট উল্লেখ করা হচ্ছে?
ফ্লো 2 কে

@ ফ্লো 2 কে শেলটি ব্যাখ্যা করছে এমন স্ক্রিপ্ট (অর্থাত্ প্রোগ্রাম)।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.