शेल फ़ंक्शन परिभाषा: उद्घाटन ब्रेस के बाद एक स्थान क्यों है?


18

आप शायद उस कांटे वाले बम के बारे में जानते हैं :

 :(){ :|:&};: #WARNING: harmful code

मुझे आश्चर्य है कि यह आवश्यक क्यों है, इसके लिए पार्स करने के लिए, घुंघराले ब्रेस खोलने के बाद एक स्थान शामिल करना है।

जवाबों:


13

{}

          { list; }

घुंघराले ब्रेसिज़ के बीच आदेशों की एक सूची रखने से सूची को वर्तमान शेल संदर्भ में निष्पादित किया जा सकता है। कोई उपधारा नहीं बनाई गई है। सूची के बाद अर्धविराम (या नई पंक्ति) की आवश्यकता है।

एक उपधारा के निर्माण के अलावा, ऐतिहासिक कारणों से इन दोनों निर्माणों के बीच एक सूक्ष्म अंतर है। ब्रेस आरक्षित शब्द हैं, इसलिए उन्हें रिक्त या अन्य शेल मेटाचैकर द्वारा सूची से अलग किया जाना चाहिए। कोष्ठक संचालक हैं, और उन्हें शेल द्वारा अलग-अलग टोकन के रूप में मान्यता प्राप्त है, भले ही वे व्हाट्सएप द्वारा सूची से अलग न हों।

// स्रोत


1
मैंने इस पृष्ठ पर अपने स्वयं के पोस्ट में आपके उत्तर से विचलित कर दिया है। यह एक फंक्शन है जो कमांड ग्रुपिंग नहीं है।
donothingsuccessfully

3
@donothingsuccessfully एक समारोह शरीर है एक कमांड समूह।
गिल्स एसओ- बुराई को रोकना '

3

मुझे लगता है कि अगर यहां भ्रामक उत्तर दिया गया तो @rush सही दे सकता है। कांटा-बम " " नामक एक फ़ंक्शन को परिभाषित करता है :। कर्ली ब्रेसिज़ में कोड तब तक निष्पादित नहीं किया जाता है जब तक कि फ़ंक्शन अंतिम " :" कहलाता है । तो कमांड समूह के रूप में घुंघराले ब्रेसिज़ और फ़ंक्शन बॉडी के रूप में घुंघराले ब्रेसिज़ समान रूप से समान होते हैं, लेकिन अलग-अलग शब्दार्थ होते हैं। @Rush का हवाला देते हुए
उसी दस्तावेज़ से :

ध्यान दें कि ऐतिहासिक कारणों के लिए, सबसे आम उपयोग में कर्ली ब्रेसिज़ जो फ़ंक्शन के शरीर को घेरते हैं, को शरीर से रिक्त स्थान या नईलाइन्स द्वारा अलग किया जाना चाहिए। ऐसा इसलिए है क्योंकि ब्रेसिज़ आरक्षित शब्द हैं और उन्हें केवल तभी पहचाना जाता है जब उन्हें व्हाट्सएप या किसी अन्य शेल मेटाचैकर द्वारा कमांड सूची से अलग किया जाता है। इसके अलावा, ब्रेसिज़ का उपयोग करते समय, सूची को अर्धविराम, 'और' या एक नई पंक्ति द्वारा समाप्त किया जाना चाहिए।


3
नहीं, भीड़ का जवाब सही है। फ़ंक्शन बॉडी के चारों ओर घुंघराले ब्रेसिज़ एक ही सिंटैक्टिक तत्व होते हैं, जब वे एक फ़ंक्शन बॉडी को सीमांकित नहीं करते हैं। शेल व्याकरण नियम देखें : a function_bodyएक compound_command(प्लस एक वैकल्पिक redirect_list) है। अंतरिक्ष की जरूरत है क्योंकि {एक आरक्षित शब्द है, विशेष चरित्र नहीं।
गाइल्स का SO- बुराई से रोकना '

हां, भीड़ का जवाब सही है, जैसा कि मैंने कहा। हां, वे वाक्यात्मक रूप से वही हैं, जैसा मैंने कहा था। लेकिन brace_groupएक समारोह का हिस्सा है और जब नहीं अलग व्यवहार करते हैं। मैं बाद के मामले का वर्णन करने के लिए कमांड ग्रुपिंग का उपयोग कर रहा था और यह वह है जिसे रश के लिंक में वर्णित किया गया था।
donothingsuccessfully

2
मुझे यकीन नहीं है कि शब्दार्थ भेद यहाँ महत्वपूर्ण है, क्योंकि यह वाक्यविन्यास है जो पार्सर के लिए मायने रखता है। वास्तविक उत्तर {कोई ऑपरेटर नहीं है, बल्कि एक आरक्षित शब्द है, और शब्दों को विशिष्ट मानने के लिए अन्य शब्दों से अलग करने की आवश्यकता है।
jw013
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.