$ () एक उपधारा है?


51

मुझे समझ में आया कि सब-सिलेन्क्स सिंटैक्स है (<commands...>), क्या $()सिर्फ़ एक सब-सिलेक्शन है जिससे आप वेरिएबल वैल्यूज़ को पुनः प्राप्त कर सकते हैं?

नोट: यह उनके प्रलेखन में अलग-अलग शब्दों के आधार पर 4.4 को बैश करने के लिए लागू होता है।


जवाबों:


75

$(…)परिभाषा के अनुसार एक उपधारा है: यह शेल रनटाइम स्थिति की एक प्रति है, और उपधारा में बने राज्य में परिवर्तन का माता-पिता पर कोई प्रभाव नहीं पड़ता है। एक subshell आम तौर द्वारा कार्यान्वित किया जाता forking एक नई प्रक्रिया (लेकिन कुछ गोले कुछ मामलों में इस का अनुकूलन कर सकते हैं)।

यह एक उपधारा नहीं है जिससे आप चर मान प्राप्त कर सकते हैं। यदि चर में परिवर्तन का माता-पिता पर प्रभाव पड़ता है, तो यह एक उपधारा नहीं होगा। यह एक सबमिशन है जिसका आउटपुट माता-पिता पुनः प्राप्त कर सकते हैं। इसके द्वारा बनाई गई उपधारा में $(…)मानक मानक एक पाइप पर सेट है, और अभिभावक उस पाइप से पढ़ता है और आउटपुट एकत्र करता है।

कई अन्य निर्माण हैं जो एक उपधारा बनाते हैं। मुझे लगता है कि यह मारपीट की पूरी सूची है:

  • के लिए subshell समूह : ( … )कुछ नहीं करता है, लेकिन एक subshell बनाने और इसे समाप्त करने के लिए के लिए प्रतीक्षा)। इसके विपरीत { … }जो समूह वाक्यात्मक उद्देश्यों के लिए विशुद्ध रूप से आदेश देते हैं और एक उपधारा नहीं बनाते हैं।
  • पृष्ठभूमि : … &एक सबस्क्रिप्शन बनाता है और इसे समाप्त करने के लिए इंतजार नहीं करता है।
  • पाइपलाइन : … | …दो उपधाराएं बनाता है, एक बाएं हाथ की ओर और एक दाएं हाथ की ओर के लिए, और दोनों को समाप्त करने के लिए इंतजार करता है। शेल एक पाइप बनाता है और बाएं हाथ की ओर के मानक आउटपुट को पाइप के राइट एंड और राइट-हैंड साइड के स्टैंडर्ड इनपुट को रीड एंड से जोड़ता है। कुछ गोले में (ksh88, ksh93, zsh, lastpipeविकल्प सेट और प्रभावी के साथ बैश ), दायाँ हाथ मूल शेल में चलता है, इसलिए पाइपलाइन का निर्माण केवल एक उपधारा बनाता है।
  • कमांड प्रतिस्थापन : $(…)(यह भी वर्तनी `…`) एक मानक सेट के साथ एक पाइप के लिए एक उपखंड बनाता है, माता-पिता में आउटपुट एकत्र करता है और उस आउटपुट में फैलता है, इसकी अनुगामी नईलाइन्स को घटाता है। (और आउटपुट आगे बंटवारे और ग्लोबिंग के अधीन हो सकता है, लेकिन यह एक और कहानी है।)
  • प्रक्रिया प्रतिस्थापन : <(…)एक पाइप के लिए सेट अपने मानक उत्पादन के साथ एक उपखंड बनाता है और पाइप के नाम तक फैलता है। माता-पिता (या कुछ अन्य प्रक्रिया) उपधारा के साथ संवाद करने के लिए पाइप खोल सकते हैं। >(…)मानक इनपुट पर पाइप के साथ भी ऐसा ही है।
  • Coprocess : coproc …एक सबस्क्रिप्शन बनाता है और इसके समाप्त होने का इंतजार नहीं करता है। सबशेल के मानक इनपुट और आउटपुट प्रत्येक पाइप के लिए सेट होते हैं, जिसमें पैरेंट प्रत्येक पाइप के दूसरे छोर से जुड़ा होता है।

¹ के रूप में एक अलग खोल चल करने का विरोध किया


क्या आप ${...}उत्तर में भी शामिल हो सकते हैं ?
user1717828

3
@ user1717828 क्या? क्यों? दूरस्थ विस्तार को इस प्रश्न से क्या लेना देना है? मैं अपने उत्तर में पूरे शेल मैनुअल को शामिल नहीं करने जा रहा हूं।
गिल्स एसओ- बुराई को रोकना '

1
दूरस्थ विस्तार को इस प्रश्न से क्या लेना देना है? मुझे नहीं पता, इसीलिए मैंने पूछा :-) तो मैं अनुमान लगा रहा हूं कि घुंघराले ब्रेस प्रतिस्थापन कोष्ठक ब्रेस प्रतिस्थापन की तरह कुछ भी नहीं है।
user1717828

@ user1717828: चर विस्तार उपधाराओं से असंबंधित है; यह पूरी तरह से एक अलग तंत्र है, और निश्चित रूप से पढ़ने लायक है यदि आप अभी शुरू कर रहे हैं!
0xdd

1
@EnricoMariaDeAngelis यह एकमात्र तरीका नहीं है, लेकिन यह सबसे प्राकृतिक तरीका है। एक और तरीका है command | { read line; … }(शेल के आधार पर, lineपाइपलाइन के बाद भी उपलब्ध हो सकता है या नहीं भी हो सकता है)। सभी तरीकों में एक सबशेल शामिल होता है क्योंकि आउटपुट उत्पन्न करने वाली कमांड को इनपुट पढ़ने वाले शेल से स्वतंत्र रूप से चलना होता है। यदि कमांड पूरी तरह से शेल में आंतरिक है (केवल शेल कंस्ट्रक्शंस और बिल्डिन्स, नो एक्सटर्नल कमांड्स), शेल शायद एक सबप्रोसेस नहीं बना सकता है, लेकिन यह सिर्फ एक ऑप्टिमाइज़ेशन है, यह अभी भी सबस्क्रिप्शन बनाता है।
गिल्स एसओ- बुराई को रोकना '10

20

Bash संस्करण 4.4 में bash (1) मैन पेज से, "EXPANSION" अनुभाग, "कमांड सब्स्टीट्यूशन" उपधारा:

बैश commandएक उप- परिवेश में निष्पादित करके विस्तार करता है [...]



1
दिलचस्प बात यह है कि CentOS 7 के तहत 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 ने "सब्स्क्रिप्शन" शब्द को शामिल करने के लिए उस वाक्य के शब्द को बदल दिया। यह एक स्पष्टीकरण था: मैनुअल ने स्पष्ट रूप से उल्लेख किया था कि विभिन्न अन्य निर्माण उप-आधार थे, लेकिन 4.4 तक यह स्पष्ट रूप से प्रतिस्थापन के लिए स्पष्ट रूप से नहीं कहा गया था।
गिल्स एसओ- बुराई को रोकना '

हां, CentOS v7.4.1708 पर (काफी हाल ही में) bash v4.2.46 है।
dr01

5

हाँ, ( commands... )एक bashउपधारा है जो commands...किसी अन्य प्रक्रिया में निष्पादित होगी ।

एकमात्र अंतर जब आपके पास $( commands... )यह होता है कि कोड का यह हिस्सा निष्पादन के बाद commands...सब कुछ के साथ बदल दिया जाएगा जो commands...लिखा था stdout

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.