বন্ধনীগুলি কি সত্যিকার অর্থে কমান্ডটি সাব-শেলের মধ্যে রাখে?


94

আমি যা পড়েছি তা থেকে, বন্ধনীগুলিতে একটি কমান্ড স্থাপন করা স্ক্রিপ্ট চালানোর অনুরূপ একটি সাবশেলে চালানো উচিত। যদি এটি সত্য হয় তবে এক্সটি রফতানি না করা হলে এটি পরিবর্তনশীল এক্সটিকে কীভাবে দেখবে?

x=1

চলমান (echo $x)কমান্ড লাইন 1 ফলাফল

echo $xকোনও স্ক্রিপ্টে চালানোর ফলে প্রত্যাশার মতো কিছুই হয় না

উত্তর:


134

মূল শেল প্রক্রিয়াটির প্রায় অভিন্ন অনুলিপি হিসাবে একটি সাবশেল শুরু হয়। হুডের নীচে, শেলটি forkসিস্টেম কলকে 1 কল করে , যা একটি নতুন প্রক্রিয়া তৈরি করে যার কোড এবং মেমরির অনুলিপি 2 । সাবশেলটি তৈরি করা হলে, এটির এবং এর পিতামাতার মধ্যে খুব কম পার্থক্য রয়েছে। বিশেষত, তাদের একই ভেরিয়েবল রয়েছে। এমনকি $$বিশেষ ভেরিয়েবল একই মান সাবশেলে রাখে: এটি আসল শেলের প্রক্রিয়া আইডি। একইভাবে $PPIDমূল শেলের পিতামাতার পিআইডি।

কয়েকটি শেল সাবশেলে কয়েকটি ভেরিয়েবল পরিবর্তন করে। বাশ BASHPIDশেল প্রক্রিয়াটির পিআইডি সেট করে, যা সাবশেলে পরিবর্তিত হয়। বাশ, জেডএস এবং ম্যাক্স পিতামাতার এবং সাব-শ্যালে $RANDOMবিভিন্ন মান অর্জনের ব্যবস্থা করে। তবে এর মতো অন্তর্নির্মিত বিশেষ ক্ষেত্রেগুলি বাদে, সমস্ত ভেরিয়েবলের মূল শেল, একই রফতানির স্থিতি, একই পঠন-স্থিতি ইত্যাদির মতো সাবশেলে একই মান থাকে All সমস্ত ফাংশন সংজ্ঞা, ওরফে সংজ্ঞা, শেল অপশন এবং অন্যান্য সেটিংসও উত্তরাধিকার সূত্রে প্রাপ্ত।

তৈরি করা একটি সাবশেলে (…)এর নির্মাতার মতো একই ফাইল বর্ণনাকারী রয়েছে। সাবসেল তৈরির কিছু অন্যান্য উপায় ব্যবহারকারী কোড কার্যকর করার আগে কিছু ফাইল বর্ণনাকারী সংশোধন করে; উদাহরণস্বরূপ, পাইপের বাম-হাতের অংশটি পাইপের সাথে সংযুক্ত স্ট্যান্ডার্ড আউটপুট সহ একটি সাব-শেল 3 এ চলে । Subshell একই বর্তমান ডিরেক্টরী, একই সংকেত মাস্ক ইত্যাদি কয়েক ব্যতিক্রম হল যে subshells কাস্টম যাত্রীর সঙ্গের নিজলটবহর উত্তরাধিকারী না দিয়ে শুরু হয়: উপেক্ষিত সংকেত ( এমন) subshell উপেক্ষা, কিন্তু অন্যান্য যাত্রীর সঙ্গের নিজলটবহর ( সংকেত ) রিসেট হয় ডিফল্ট ক্রিয়া 4trap '' SIGNALtrap 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ফাঁদটি চালানোর জন্য নেই ।


2
@ কুসালানন্দ নং ( x=out; (x=in; echo $x))
গিলস

2
@ ফ্লো 2 কে একই স্তরে ঘটে যাওয়া জিনিসগুলির জন্য এটি বিস্তারের ক্রম। তবে আপনাকে কীভাবে সম্প্রসারণের সাথে মূল্যায়ন মিশ্রিত করা উচিত তাও বিবেচনা করতে হবে। যখন প্রসারণের জন্য নেস্টেড কনস্ট্রাক্টের মূল্যায়ন প্রয়োজন হয়, তখন অভ্যন্তরীণ গঠনটি প্রথমে মূল্যায়ন করা হয়। সুতরাং, উদাহরণস্বরূপ, মূল্যায়নের echo $(x=2; echo $x)জন্য খণ্ডটি $(x=2; echo $x)প্রসারিত করা দরকার। এর জন্য কমান্ডটি মূল্যায়ন করা দরকার x=2; echo $x$xঅংশটি মূল্যায়ন করার পরে, এই মূল্যায়নের সময় এর প্রসারণ ঘটে x=2
গিলস

2
@ ফ্লো 2 কে প্যারামিটার সম্প্রসারণ এবং কমান্ড প্রতিস্থাপনের মধ্যে কোনও আদেশ নেই। নোট করুন যে এই বাক্যটি বিস্তৃত পদক্ষেপগুলি পৃথক করতে অর্ধিকোলন ব্যবহার করে, তবে প্যারামিটার সম্প্রসারণ এবং কমান্ড প্রতিস্থাপন একই সেমিকোলন-বিস্মৃত ধারাতে রয়েছে (হ্যাঁ, এটি সূক্ষ্ম)। অর্ডারটি তখন গুরুত্বপূর্ণ হয় যখন কোনও অংশের একটি পার্শ্ব প্রতিক্রিয়া থাকে যা অন্য অংশকে প্রভাবিত করে, যেমন ( xআনসেট সহ) echo $(echo foo >somefile)${x-$(cat somefile)}বা echo $(echo $x),${x=1}
গিলস

1
@Gilles; আমি দ্বিধান্বিত. কোনও সাবস্কেল যদি কোনও স্ক্রিপ্ট কার্যকর করার চেয়ে আলাদা হয় তবে কেন এটি বলা হয়: শেল স্ক্রিপ্ট চালানো একটি নতুন প্রক্রিয়া শুরু করে, একটি সাব-শেল। ? এছাড়াও, শেল পরিবেশের সদৃশ হিসাবে একটি সাব-শেল পরিবেশ তৈরি করা হবে । অতএব,। / ফাইলটি সাব-শেল পরিবেশে কার্যকর করা হবে এবং সুতরাং এটি ভেরিয়েবল অ্যাসাইনমেন্ট দ্বারা সেট করা শেল পরামিতিগুলির উত্তরাধিকারী হওয়া উচিত।
হ্যাক

2
@ হ্যাকস এবিএস-এর সংজ্ঞাটি একটি আনুমানিক, এবং খুব ভাল একটি নয়। উদাহরণগুলি ভাল তবে পৃষ্ঠার প্রথম দুটি লাইন এতই বড় আকারের হয়েছে যে সেগুলি ভুল। অন্য স্ক্রিপ্ট থেকে একটি স্ক্রিপ্ট চালাতে একটি নতুন প্রক্রিয়া যা আরম্ভ করা না একটি subshell। SUS- এ সংজ্ঞাগুলি সঠিক (তবে সবসময় বোঝার পক্ষে খুব সহজ নয়)। ./fileএকটি সাব-শেইলে কার্যকর করা হয় না। এছাড়াও unix.stackexchange.com/q/261638 এবং unix.stackexchange.com/a/157962
গিলস

15

স্পষ্টতই, হ্যাঁ, সমস্ত ডকুমেন্টেশন যেমন বলেছে, একটি প্রথম বন্ধনীযুক্ত কমান্ডটি একটি সাব-শেইলে চালিত হয়।

সাব-শেল সমস্ত পিতামাতার চলকগুলির একটি অনুলিপি উত্তরাধিকারসূত্রে প্রাপ্ত। পার্থক্যটি হ'ল আপনি সাবশেলে যে কোনও পরিবর্তনগুলি পিতামাতার মধ্যেও করা হয় না।

Ksh ম্যান পেজটি এটিকে বাশার চেয়ে একটু পরিষ্কার করে তুলেছে:

man ksh:

অ-রফতানযোগ্য ভেরিয়েবলগুলি না সরিয়ে একটি সাব-শেলের মধ্যে একটি প্রথম বন্ধনী কমান্ড কার্যকর করা হয়।

man bash:

(তালিকা)

তালিকাটি একটি সাব-শেল পরিবেশে কার্যকর করা হয় (নীচে কম্যান্ড এক্সিকিউশন এনভায়রনমেন্ট দেখুন)। পরিবর্তনশীল অ্যাসাইনমেন্ট এবং বিল্টিন কমান্ডগুলি যা শেলের পরিবেশকে প্রভাবিত করে কমান্ডটি সম্পূর্ণ হওয়ার পরে কার্যকর হয় না।

কম্যান্ড এক্সিকিউশন এনভায়রনমেন্ট

শেলের একটি সম্পাদন পরিবেশ রয়েছে, যা নিম্নলিখিতগুলি নিয়ে গঠিত: [...] শেল প্যারামিটারগুলি যা ভেরিয়েবল অ্যাসাইনমেন্ট দ্বারা সেট করা হয় [...]।
কমান্ড প্রতিস্থাপন, প্রথম বন্ধনী যুক্ত কমান্ড, এবং অ্যাসিনক্রোনাস কমান্ডগুলি শেল পরিবেশের সদৃশ একটি সাব-শেল পরিবেশে ডাকা হয়, [...]


3
এটি এর সাথে বিপরীতমুখী হতে হবে When a simple command other than a builtin or shell function is to be executed, it is invoked in a separate execution environment that consists of the following., যার মধ্যে আইটেম রয়েছে: · shell variables and functions marked for export, along with variables exported for the command, passed in the environment(একই man bashবিভাগ থেকে) যা ব্যাখ্যা করে যে কোনও echo $xস্ক্রিপ্ট xরফতানি না করা হলে কেন কিছুই প্রিন্ট করে না ।
জোহান ই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.