$ () একটি সাবশেল?


51

আমি বুঝতে পারলাম সাবসেল সিনট্যাক্সটি (<commands...>), $()কেবলমাত্র একটি সাবশেল যা আপনি ভেরিয়েবলের মানগুলি পুনরুদ্ধার করতে পারবেন?

দ্রষ্টব্য: এটি তাদের ডকুমেন্টেশনের বিভিন্ন শব্দের উপর ভিত্তি করে 4.4 বাশকে প্রযোজ্য।


উত্তর:


75

$(…)সংজ্ঞা অনুসারে এটি একটি সাবশেল: এটি শেল রানটাইম রাষ্ট্রের অনুলিপি the একটি সাবসেল সাধারণত একটি নতুন প্রক্রিয়া কাঁটাচামচ করে প্রয়োগ করা হয় (তবে কিছু শেল কিছু ক্ষেত্রে এটি অপ্টিমাইজ করতে পারে)।

এটি এমন একটি সাবশেল নয় যা থেকে আপনি পরিবর্তনশীল মানগুলি পুনরুদ্ধার করতে পারেন। ভেরিয়েবলের পরিবর্তনগুলি যদি পিতামাতার উপর প্রভাব ফেলে তবে এটি সাবসেল হবে না। এটি এমন একটি সাব-শেল যার আউটপুট পিতামাতারা পুনরুদ্ধার করতে পারে। দ্বারা নির্মিত সাবশেলের $(…)একটি স্ট্যান্ডার্ড আউটপুট একটি পাইপে সেট করা আছে, এবং পিতামাতা সেই পাইপ থেকে পড়ে এবং আউটপুট সংগ্রহ করে।

আরও কয়েকটি কনস্ট্রাকশন রয়েছে যা একটি সাবশেল তৈরি করে। আমি মনে করি এটি বাশের সম্পূর্ণ তালিকা:

  • জন্য Subshell গ্রুপিং : ( … )কিছুই না কিন্তু একটি subshell তৈরি করব এবং বিনষ্ট হওয়ার জন্য অপেক্ষা করুন)। { … }কোন গোষ্ঠীগুলি বিশুদ্ধভাবে সিন্ট্যাকটিক উদ্দেশ্যে আদেশ দেয় এবং একটি সাব-শেল তৈরি করে না তার সাথে বৈসাদৃশ্য করুন ।
  • পটভূমি : … &একটি সাব-শেল তৈরি করে এবং এটি সমাপ্ত হওয়ার জন্য অপেক্ষা করে না।
  • পাইপলাইন : … | …দুটি সাবশেল তৈরি করে, একটি বাম-হাতের জন্য এবং একটি ডান-হাতের জন্য এবং দুটি অপসারণের জন্য অপেক্ষা করে। শেলটি একটি পাইপ তৈরি করে এবং বাম-হাতের স্ট্যান্ডার্ড আউটপুটটিকে পাইপের রাইটিং প্রান্ত এবং ডান হাতের পাশের স্ট্যান্ডার্ড ইনপুটটিকে পড়ার শেষের সাথে সংযুক্ত করে। কিছু শেল (ksh88, ksh93, zsh, বাশ lastpipeবিকল্প বিকল্প এবং কার্যকর) সহ ডান-হাতটি মূল শেলটিতে চলে, সুতরাং পাইপলাইনটি কেবল একটি সাবশেল তৈরি করে।
  • কমান্ড প্রতিস্থাপন : $(…)(এছাড়াও বানান `…`) তার পাইকারে সেট করা স্ট্যান্ডার্ড আউটপুট সহ একটি সাবশেল তৈরি করে, পিতামাতার মধ্যে আউটপুট সংগ্রহ করে এবং সেই আউটপুটটিতে প্রসারিত হয়, এর পিছনে পিছনে থাকা নতুন লাইনের বিয়োগ। (এবং আউটপুটটি আরও বিভাজন এবং গ্লোব্বিংয়ের বিষয় হতে পারে তবে এটি অন্য গল্প another
  • প্রক্রিয়া প্রতিস্থাপন : <(…)একটি পাইপে সেট করা এর স্ট্যান্ডার্ড আউটপুট সহ একটি সাবশেল তৈরি করে এবং পাইপের নামে প্রসারিত হয়। অভিভাবক (বা অন্য কোনও প্রক্রিয়া) সাব-শেলের সাথে যোগাযোগের জন্য পাইপটি খুলতে পারে। >(…)একই ইন কিন্তু স্ট্যান্ডার্ড ইনপুট নেভিগেশন।
  • কপ্রোসেস : coproc …একটি সাব-শেল তৈরি করে এবং এটি সমাপ্ত হওয়ার জন্য অপেক্ষা করে না। সাবশেলের স্ট্যান্ডার্ড ইনপুট এবং আউটপুট প্রতিটি পাইপের অন্য পাইকারের অন্য প্রান্তের সাথে পিতামাতার সাথে সংযুক্ত থাকায় একটি পাইপে সেট করা হয়।

A পৃথক শেল চালানোর বিপরীতে


আপনি কি ${...}উত্তর অন্তর্ভুক্ত করতে পারেন ?
ব্যবহারকারী 1717828

3
@ ব্যবহারকারী 1717828 কি? কেন? এই প্রশ্নের সাথে দূরবর্তী থেকে পরিবর্তনশীল সম্প্রসারণের কী সম্পর্ক রয়েছে? আমি আমার উত্তরে পুরো শেল ম্যানুয়ালটি অন্তর্ভুক্ত করব না।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

1
এই প্রশ্নের সাথে দূরবর্তী থেকে পরিবর্তনশীল সম্প্রসারণের কী সম্পর্ক রয়েছে? আমি জানি না, এজন্যই আমি জিজ্ঞাসা করেছি :-) সুতরাং আমি অনুমান করছি যে কোঁকড়া ধনুর্বন্ধনী প্রতিস্থাপন বন্ধনী ব্রেস প্রতিস্থাপনের মতো কিছুই নয়।
ব্যবহারকারী 1717828

@ ব্যবহারকারী 1717828: পরিবর্তনশীল সম্প্রসারণ সাব-শেলের সাথে সম্পর্কিত নয়; এটি সম্পূর্ণরূপে একটি পৃথক প্রক্রিয়া, এবং আপনি সবে শুরু করছেন কিনা তা অবশ্যই পড়া দরকার!
0xdd

1
@ এনারিকোমারিয়াডে অ্যাঞ্জেলিস এটি একমাত্র উপায় নয়, তবে এটি সবচেয়ে প্রাকৃতিক উপায়। আরেকটি উপায় হ'ল command | { read line; … }(শেলের উপর নির্ভর করে lineপাইপলাইনের পরেও পাওয়া যায় বা নাও পারে)। সমস্ত উপায় একটি সাবશેল জড়িত কারণ আউটপুট উত্পাদন করে যে কমান্ড ইনপুট পড়া শেল স্বাধীনভাবে চালানো হয়। যদি কমান্ডটি শেলের সম্পূর্ণ শুকনো অভ্যন্তরীণ হয় (কেবল শেল তৈরি করে এবং অন্তর্নির্মিত, কোনও বহিরাগত কমান্ড নেই), শেলটি একটি সাবপ্রসেস তৈরি করতে পারে না, তবে এটি কেবল একটি অপ্টিমাইজেশন, এটি এখনও একটি সাবশেল তৈরি করে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

20

বাশ সংস্করণ ৪.৪, "বিবরণ" বিভাগে "কমান্ড সাবস্টিটিউশন" উপধারা বাশ (১) ম্যান পৃষ্ঠা থেকে:

বাশ commandএকটি সাব-শেল পরিবেশে সম্পাদন করে সম্প্রসারণ সম্পাদন করে [...]



1
মজার বিষয় হচ্ছে, সেন্টোস under এর অধীনে ম্যানপেজটি bashকোনও সাব-শেলের উল্লেখ নেই: Bash performs the expansion by executing command and replacing the command substitution with the standard output of the command, with any trailing newlines deleted.আমি ভাবছি এটি যদি ইচ্ছাকৃতভাবে বাদ পড়ে।
dr01

6
@ dr01 বিপরীতে, বাশ 4.4 "সাবশেল" শব্দটি অন্তর্ভুক্ত করার জন্য সেই বাক্যটির শব্দাবলীর পরিবর্তন করেছে। এটি একটি ব্যাখ্যা ছিল: ম্যানুয়ালটিতে স্পষ্টভাবে উল্লেখ করা হয়েছিল যে অন্যান্য বিভিন্ন নির্মাণ সাবসেল ছিল, তবে ৪.৪ অবধি এটি কমান্ড প্রতিস্থাপনের জন্য স্পষ্টভাবে বলা হয়নি।
গিলস 8'17 এ '

হ্যাঁ, CentOS v7.4.1708 এ (মোটামুটি সাম্প্রতিক) বাশটি v4.2.46।
dr01

5

হ্যাঁ, ( commands... )এমন একটি bashসাবশেল যা commands...অন্য প্রক্রিয়াতে কার্যকর হবে ।

আপনার কাছে কেবল তখনই পার্থক্য $( commands... )হ'ল কোডের এই অংশটি কার্যকর করার পরে commands...যা কিছু commands...লেখা হয়েছিল তার সাথে প্রতিস্থাপন করা হবে stdout

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