क्या कार्य बाश में उपप्रकारों के रूप में चलते हैं?


28

में उन्नत बैश-पटकथा गाइड , में उदाहरण 27-4 , 7-वें नीचे से लाइन, मैं इस पढ़ा है:

एक फ़ंक्शन एक उप-प्रक्रिया के रूप में चलता है।

मैंने बैश में एक परीक्षण किया, और ऐसा लगता है कि उपरोक्त कथन गलत है।

इस साइट पर खोज, बैश मैन, और मेरे खोज इंजन में कोई रोशनी नहीं है।

क्या आपके पास इसका उत्तर है और आप इसे समझाना चाहेंगे?


12
जैसा कि कहा गया है, कि गाइड चरम में भ्रामक है। मैं इसके बजाय वूल्श बैश गाइड की सलाह देता हूं ।
वाइल्डकार्ड

जवाबों:


36

एडवांस्ड बैश-स्क्रिप्टिंग गाइड हमेशा विश्वसनीय नहीं होता है और इसके उदाहरण स्क्रिप्ट में आउट-डेटेड प्रथाएं होती हैं जैसे कि कमांड प्रतिस्थापन के लिए प्रभावी रूप से पदावनत किए गए बैकटीक्स का उपयोग करना , `command`बल्कि इसके बजाय $(command)

इस विशेष मामले में, यह स्पष्ट रूप से गलत है।

(कैनोनिकल) बैश मैनुअल में शेल फ़ंक्शंस पर अनुभाग निश्चित रूप से बताता है कि

शेल फ़ंक्शन को वर्तमान शेल संदर्भ में निष्पादित किया जाता है; उनकी व्याख्या करने के लिए कोई नई प्रक्रिया नहीं बनाई गई है।


10
"उन्नत बैश-स्क्रिप्टिंग गाइड आम तौर पर अविश्वसनीय है" बहुत सच है।
23:10 पर जॉन 1024

1
क्या आप अपने पहले वाक्य का समर्थन करने के लिए संदर्भ दे सकते हैं?
विलसन

5
@WillVousden यहां एक संदर्भ कैसा दिखेगा? गाइड की तकनीकी कमी के उदाहरणों का एक गुच्छा? एक दस्तावेज जहां बैश समुदाय के विशेषज्ञों ने पहले उल्लेख किया है कि यह अविश्वसनीय है? क्या यह मदद करेगा यदि बैश में सोने के बैज के साथ एक स्टैवर्डोफ्लो सदस्य सिर्फ एक टिप्पणी में सहमत हो? : p
kojiro

3
@WillVousden मुझे नहीं लगता कि आप जो चाहते हैं वह एक विश्वसनीय रूप में मौजूद है। मेंडल कूपर ने अतीत में गाइड के साथ मुद्दों को अद्यतन और निर्धारित किया है, लेकिन कोई सार्वजनिक बग ट्रैकर या इरेटा की सूची नहीं है। (शायद यह सबसे ज्यादा नुकसानदायक बयान है जो मैं कर सकता हूं।) इसलिए जब हमें कोई दोष (वास्तविक या वास्तविक) लगता है तो हम कर सकते हैं कि लेखक को ईमेल करें और सबसे अच्छा होने की उम्मीद करें।
कोजीरो

3
@WillVousden, ... यदि आप एक चाहते इतिहास कब तक freenode #bash चैनल में आम सहमति से किया गया है कि एबीएस से बचा जाना चाहिए की, देखने wooledge.org/~greybot/meta/abs दूसरे क्षेत्र प्रत्येक पंक्ति में - टाइमस्टैम्प है, और पहला उपयोगकर्ता नाम है; मैं आशा करता हूं कि यह दावा करते हुए कि उपयोगकर्ता नाम बहुत अच्छी तरह से सम्मानित व्यक्ति हैं।
चार्ल्स डफी

32

घुंघराले ब्रेस फ़ंक्शन कॉलिंग शेल प्रक्रिया के भीतर चलेंगे, जब तक कि उन्हें अपने स्वयं के उप-संस्करण की आवश्यकता न हो:

  • जब आप उन्हें पृष्ठभूमि में चलाते हैं &
  • जब आप उन्हें एक पाइपलाइन में लिंक के रूप में चलाते हैं

पुनर्निर्देशन या अतिरिक्त एन.वी. चर एक नई उपधारा को बाध्य नहीं करेंगे:

hw(){
    echo hello world from $BASHPID
    echo var=$var
} 
var=42 hw >&2
echo $BASHPID  #unexports var=42 and restores stdout here

यदि आप कर्ल के बजाय कोष्ठक के साथ फ़ंक्शन को परिभाषित करते हैं:

hw()(
  echo hello world from $BASHPID
)
hw 
echo $BASHPID

यह हमेशा एक नई प्रक्रिया में चलेगा।

कमांड प्रतिस्थापन $()भी हमेशा बैश में प्रक्रियाएं बनाता है (लेकिन यदि आप इसके अंदर बिलियन चलाते हैं तो ksh में नहीं)।


मुझे नहीं पता था कि f() (...)अनुमति है। क्या इसके अलावा {...}और कोई परिभाषा है (...)? बैश में, मैं अभी तक दूसरों में नहीं हूं।
टॉमाज़

1
@tomas आप उपयोग कर सकते हैं function hw { echo hello world; } वाक्य रचना (की कोई आवश्यकता नहीं ()है, तो आप टाइप functionऔर आप सही फाइनल के बाद पुनर्निर्देशन निर्दिष्ट कर सकते हैं }या )के रूप में hw(){ echo error; } >&2इसके बारे में कि
PSkocik

2
यह वह उत्तर है जिसके बारे में मैंने तुरंत सोचा था, और यह बिल्कुल सही है। इसे सही उत्तर के रूप में मतदान किया जाना चाहिए। f()(...)हमेशा अपने स्वयं के शेल को निष्पादित करें, जबकि f(){...}नहीं करता है।
rexkogitans 8

11
NB bash फ़ंक्शन किसी भी कंपाउंड कमांड को स्वीकार करते हैं, इसलिए foo() [[ x = x ]]एक मान्य फ़ंक्शन परिभाषा भी है। हालाँकि, यदि आप फ़ंक्शन को type fooदेखते हैं , तो आप देखेंगे कि यह अभी भी चीनी के लिए है foo() { [[ x = x ]]; }। वही सब-फाल्स फंक्शंस का सच है: bar() ( : )बन जाता है bar() { ( : ); }
कोजिरो

1
@kojiro अच्छा +1। नहीं पता था कि
PSkocik

9

उस उदाहरण से विचाराधीन कमांड इस प्रकार है:

echo ${arrayZ[@]/%e/$(replacement)}

उदाहरण बाद में बताता है:

#    $( ... ) is command substitution.
#    A function runs as a sub-process.

एबीएस गाइड के लिए धर्मार्थ होने के नाते, जो वे जाहिरा तौर पर लिखने के लिए थे, वह यह है कि फ़ंक्शन कमांड प्रतिस्थापन के अंदर चलता है और कमांड प्रतिस्थापन के अंदर कमांड सब- डिस्क्रिप्शन में चलता है ।


यह बहुत भ्रामक है। आपकी व्याख्या के लिए धन्यवाद।
टॉमाज़

5
@ टोमास "बहुत भ्रामक।" हाँ बहुत। एबीएस गाइड के विपरीत, ग्रेग विकी उन्नत बैश जानकारी का एक उत्कृष्ट स्रोत है।
23:10 पर जॉन 1024

1
चीयर्स। इस बारे में आपकी क्या राय है: wiki.bash-hackers.org/start ?
टॉमाज़

@tomas मुझे उस एक का पहले हाथ का ज्ञान नहीं है।
जॉन १०२४

2
@ टोमास, ... बैश-हैकर्स विकी के रूप में मेरी अपनी राय है कि यह एक उत्कृष्ट स्रोत है। मैं इसके माध्यम से बड़े पैमाने पर नहीं हुआ क्योंकि मेरे पास वूल्ज विकी है, लेकिन यह सटीक और सटीक रूप से लिखा गया है।
चार्ल्स डफी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.