POSIX शैल व्याकरण में उद्घाटन ब्रेस के बाद ब्रेस कमांड समूह को रिक्त स्थान की आवश्यकता क्यों है?


10

TL; DR : POSIX ब्रेस समूह को {आरक्षित शब्द के बाद रिक्त स्थान की आवश्यकता क्यों है, लेकिन आरक्षित शब्द के बाद उपधारा नहीं है (?

POSIX शेल व्याकरण ब्रेस समूह को परिभाषित करता है और निम्नानुसार उप-प्रकार होता है

brace_group      : Lbrace compound_list Rbrace

subshell         : '(' compound_list ')'

अब, अगर हम पढ़ रहे हैं कि सचमुच, रिक्त स्थान महत्वपूर्ण हैं। इसका मतलब यह होगा कि ब्रेस और कोष्ठक को खोलने और बंद करने के लिए स्पेस डेलिनेटिंग होना चाहिए

{ echo hello world; }

( echo hello world )

यह यौगिक कमांड परिभाषाओं के साथ भी संरेखित होगा :

इनमें से प्रत्येक कंपाउंड कमांड में शुरुआत में एक आरक्षित शब्द या नियंत्रण ऑपरेटर होता है, और अंत में एक संबंधित टर्मिनेटर आरक्षित शब्द या ऑपरेटर होता है।

हालांकि इसका मतलब यह नहीं है कि क्यों (list)और ( list )ठीक काम है (उस स्थान की (आवश्यकता नहीं है), हालांकि ब्रेस विस्तार के लिए एक अग्रणी स्थान होना चाहिए, अर्थात {echo hello;}काम नहीं करेगा।

निश्चित रूप से आरक्षित शब्द को शेल शब्द के रूप में माना जा रहा है, जिससे क्षेत्र के बंटवारे की अवधारणा के साथ संरेखित करने के लिए एक स्थान की आवश्यकता होती है , हालांकि परिभाषा स्वयं ही रिक्त स्थान का उल्लेख नहीं करती है। इसके अलावा, अगर {और (दोनों को कंपोजिट कमांड की POSIX परिभाषा द्वारा आरक्षित शब्द माना जाता है , तो इन आरक्षित शब्दों के बाद अंतरिक्ष वर्ण के संबंध में अलग तरह से व्यवहार क्यों किया जाता है? अब, ksh (1) मैनुअल स्टेट करता है:

शब्द, जो वर्णों के अनुक्रम होते हैं, निर्विवाद श्वेत-स्थान वाले वर्णों (स्थान, टैब और न्यूलाइन) या मेटा-वर्णों (<,>,;,;, &, (और)) द्वारा सीमांकित किए जाते हैं।

दूसरे शब्दों में, यह समझ में आता है कि ksh (शब्द सीमांकक के रूप में पहचाना जाएगा , जहां पहला शब्द एक कमांड या चर असाइनमेंट होगा। POSIX, हालांकि (मेटा-वर्ण के रूप में उल्लेख नहीं करता है । पोसिक्स व्याकरण के रूप में अब तक मैंने जो संभव विवरण पाया है, वह {"टोकन" माना जाता है , जहां एक के रूप (में सूचीबद्ध नहीं है।

/* These are reserved words, not operator tokens, and are
   recognized when reserved words are recognized. */


%token  Lbrace    Rbrace    Bang
/*      '{'       '}'       '!'   */

तो इस विसंगति के लिए सटीक तर्क क्या होगा?

स्वीकृत उत्तर नोट:

  • इसहाक के उत्तर के लिए स्वीकार किए गए चेकमार्क को स्थानांतरित कर दिया क्योंकि यह q uote मानक को स्वयं प्रदान करता है जो सीधे मेरे प्रश्न को संबोधित करता है:

    उदाहरण के लिए, '(' और ')' कंट्रोल ऑपरेटर्स हैं, ताकि <space>(सूची में) की जरूरत न पड़े । हालांकि, '{' और '}' {सूची;} में आरक्षित शब्द हैं, ताकि इस मामले में अग्रणी <space>और <semicolon>आवश्यक हो।

  • कुसलानंद का उत्तर स्वीकार करना । कुसलानंद का जवाब मुझे पता है कि मुझे क्या चाहिए, हालांकि ज्यादातर अनौपचारिक और सहज दृष्टिकोण से; यह बताता है {कि एक आरक्षित शब्द है और (ऑपरेटर है। माइकल होमर ने टिप्पणियों में भी यही कहा - कंपाउंड कमांड की परिभाषा में कहा गया है (जोर दिया गया):

    इनमें से प्रत्येक कंपाउंड कमांड में शुरुआत में एक आरक्षित शब्द या नियंत्रण ऑपरेटर होता है

  • {शेल व्याकरण में सूचीबद्ध forया उसके समान आरक्षित शब्द के रूप में परिभाषित किया गया है while(प्रश्न में अंतिम कोड ब्लॉक देखें)

  • धारा 2.9 राज्य (जोर दिया गया):

    विशेष रूप से, अभ्यावेदन में कुछ स्थानों पर टोकन के बीच अंतर शामिल होता है जहां <blank>एस आवश्यक नहीं होगा (जब टोकन में से एक ऑपरेटर होता है)।

  • जबकि मानक स्पष्ट (रूप से ऑपरेटर के रूप में परिभाषित नहीं करता है , ऑपरेटर के रूप (में संदर्भित किया जाता है; विशेष रूप से, खंड 2.9.2 कहता है

    यदि पाइपलाइन आरक्षित शब्द से शुरू होती है! और कमांड 1 एक उप-कमांड कमांड है, एप्लिकेशन यह सुनिश्चित करेगा कि कमांड 1 की शुरुआत में ऑपरेटर को एक या एक से अधिक वर्णों से अलग किया जाए। आरक्षित शब्द का व्यवहार! इसके तुरंत बाद (ऑपरेटर अनिर्दिष्ट है)

  • डिजिटल ट्रॉमा द्वारा ढेर अतिप्रवाह पर प्रश्न आरक्षित शब्दों पर धारा 2.4 बताते हैं:

    यह मान्यता तब होगी जब कोई भी वर्ण उद्धृत नहीं किया जाता है और जब इस शब्द का उपयोग किया जाता है:

    -एक कमांड का पहला शब्द

  • जैसा कि कुसलानंद के उत्तर में उल्लेख किया गया है "पोसिक्स व्याकरण में दिखाए गए स्थान वे रिक्त स्थान नहीं हैं जो शेल इनपुट डेटा में होने की आवश्यकता है, लेकिन केवल व्याकरण को प्रदर्शित करने का एक तरीका है। यह तथ्य है कि ब्रेस आरक्षित शब्द हैं जो कि निहित है। उन्हें व्हॉट्सएप से घिरे रहना होगा "जैसा कि माइकल होमर ने टिप्पणियों में बताया है :" यदि रिक्त स्थान अपने आप में महत्वपूर्ण थे, तो उन्हें उत्पादन में सूचीबद्ध करने की आवश्यकता होगी "

मामला समाप्त।


3
यदि रिक्त स्थान अपने आप में महत्वपूर्ण थे, तो उन्हें उत्पादन में सूचीबद्ध करने की आवश्यकता होगी।
माइकल होमर

2
"आगे, अगर {और (दोनों को कंपोज़ कमांड की POSIX परिभाषा द्वारा आरक्षित शब्द माना जाता है" cf। "इनमें से प्रत्येक यौगिक कमांड में शुरुआत में एक आरक्षित शब्द या नियंत्रण ऑपरेटर होता है"।
माइकल होमर

2
@SergiyKolodyazhnyy मेरा मानना ​​है कि उनका मतलब है कि यदि अंतरिक्ष महत्वपूर्ण था, तो व्याकरण को एक स्पष्ट स्थान चरित्र ( ' ') शामिल करना होगा। इसके बजाय, रिक्त स्थान शब्दों द्वारा निहित है कि टोकन शब्द क्या हैं।
Kusalananda

2
टोकन वर्ग की विनिर्देश परिभाषा है ... अजीब, कम से कम कहने के लिए। पूरा व्याकरण बहुत भयानक है और गद्य-पाठ में चीजों को परिभाषित करने वाली कल्पना मिश्रित होती है (कभी-कभी निहित होती है!), गद्य नियमों में व्याकरण से पहले, और व्याकरण में ही। यदि आप पहले से ही जवाब नहीं जानते हैं और पीछे की ओर काम करते हैं तो यह बहुत ही समझ से बाहर है। लेक्सिकल नियम सभी को पीछे की ओर से परिभाषित किया जाता है, एक नया टोकन शुरू करने के बजाय, यह वर्णन करने के बजाय कि टोकन में क्या है। यह सिर्फ एक गड़बड़ है।
माइकल होमर

1
@ औपचारिक व्याकरण में शेरगी, एक उत्पादन (या उत्पादन नियम) बताता है कि आप किसी और चीज़ से कुछ कैसे उत्पन्न कर सकते हैं। देखें en.wikipedia.org/wiki/Product_%28computer_science%29 इसलिए command : simple_command | compound_command | compound_command redirect_list | function_definition ;एक ऐसा उत्पादन है जो कहता है कि जहां आपके पास एक कमांड हो सकती है, यह साधारण कमांड, कंपाउंड कमांड या पुनर्निर्देशन के साथ कंपाउंड कमांड या फ़ंक्शन परिभाषा में से एक हो सकता है।
मुरु

जवाबों:


6

यह उस तरीके की एक सीमा है जिसमें शेल टूट कर टोकन में पहुंच जाती है।

शेल इनपुट फ़ाइल से लाइनें पढ़ता है और धारा 2 "शेल परिचय" के अनुसार उन्हें एक शब्द या एक ऑपरेटर में परिवर्तित करता है :

  1. शेल इनपुट को टोकन में तोड़ता है: शब्द और ऑपरेटर

{एक आरक्षित शब्द है

कुछ शब्द आरक्षित शब्द हैं

आरक्षित शब्द ऐसे शब्द हैं जिनका खोल के लिए विशेष अर्थ है। निम्नलिखित शब्दों को आरक्षित शब्दों के रूप में पहचाना जाएगा:

! { } case do done elif else esac fi for if in then until while

शब्दों को शब्दों के रूप में पहचाना जाना चाहिए , उन्हें सीमांकित किया जाना चाहिए

आरक्षित शब्दों को तभी पहचाना जाता है जब उनका सीमांकन किया जाता है ...

ज्यादातर ब्लैंक (बिंदु 7) और ऑपरेटरों द्वारा।

  1. यदि वर्तमान वर्ण एक अयोग्य है <रिक्त>, तो पिछले वर्ण वाले किसी भी टोकन को सीमांकित किया गया है और वर्तमान वर्ण को छोड़ दिया जाएगा।

(एक ऑपरेटर है

ऑपरेटर खुद से खड़े होते हैं :

जबकि परिचालक खुद परिसीमनकर्ता हैं।

जहां "ऑपरेटर" या तो हैं :

३.२६० ऑपरेटर

शेल कमांड भाषा में, या तो एक नियंत्रण ऑपरेटर या एक पुनर्निर्देशन ऑपरेटर।

पुनर्निर्देशन ऑपरेटर हैं :

पुनर्निर्देशन संचालक

शेल कमांड भाषा में, एक टोकन जो पुनर्निर्देशन फ़ंक्शन करता है। यह निम्नलिखित प्रतीकों में से एक है:

<     >     >|     <<     >>     <&     >&     <<-     <>

नियंत्रण ऑपरेटर हैं :

3.113 कंट्रोल ऑपरेटर

शेल कमांड भाषा में, एक टोकन जो एक नियंत्रण फ़ंक्शन करता है। यह निम्नलिखित प्रतीकों में से एक है:

&   &&   (   )   ;   ;;   newline   |   ||

निष्कर्ष

तो, '(' और ')' '' {''} '' आरक्षित शब्द हैं, जबकि नियंत्रण ऑपरेटर हैं।

और आपके प्रश्न का सटीक विवरण कल्पना के अंदर है :

उदाहरण के लिए, '(' और ')' कंट्रोल ऑपरेटर हैं, ताकि (सूची) में कोई <space> की जरूरत न पड़े। हालांकि, '{' और '}' आरक्षित शब्द {सूची;} में हैं, ताकि इस मामले में अग्रणी <space> और <semicolon> की आवश्यकता हो।

जो वास्तव में बताता है कि क्यों एक अंतरिक्ष (या कुछ अन्य सीमांकक) एक के बाद की आवश्यकता है {

यह मान्य है:

{ echo yes;}

यह इस प्रकार है:

{(echo yes);}

इस:

{(echo yes)}

या यह भी:

{>/dev/tty echo yes;}

खैर, अंतिम उद्धरण बिल्कुल हाजिर है! + 1'ed। मुझे अब प्रश्न और उत्तर की समीक्षा करने की आवश्यकता होगी
सर्जियो कोलोडियाज़नी

13

घुंघराले ब्रेसिज़ और कोष्ठक के बीच अंतर यह है कि ब्रेसिज़ (और !) आरक्षित शब्द हैं, जैसे for, कोष्ठक नियंत्रण ऑपरेटर हैं if, thenजबकि आदि। शब्दों को व्हॉट्सएप से अलग करना होगा।

इसका मतलब है कि जैसे आपके पास नहीं है

foriin*; do

आपके पास नहीं हो सकता

{somecommand;} >file

या

if !somecommand; then

POSIX व्याकरण में दिखाए गए रिक्त स्थान वे रिक्त स्थान नहीं हैं, जो शेल इनपुट डेटा में होने की आवश्यकता है, लेकिन केवल व्याकरण को प्रदर्शित करने का एक तरीका है। यह तथ्य है कि ब्रेसिज़ आरक्षित शब्द हैं, जिसका अर्थ है कि उन्हें व्हाट्सएप से घिरा होना है, जबकि एक उपधारा के कोष्ठक नहीं।


1
खैर, यह बहुत ज्यादा इसका जवाब लगता है और मुझे लगता है कि यह कहता है "विशेष रूप से, प्रतिनिधित्व में कुछ स्थानों पर टोकन के बीच रिक्ति शामिल है जहां <रिक्त> आवश्यक नहीं होगा (जब टोकन में से एक ऑपरेटर है)"। बस एक सवाल: मानक (ऑपरेटर के रूप में कहां परिभाषित करता है? यह कम से कम व्याकरण के खंड में नहीं है
सर्गी कोलोडियाज़नी

@MichaelHomer आह, "नियंत्रण ऑपरेटर", जैसे ;। उसके लिए धन्यवाद।
Kusalananda

नियंत्रण ऑपरेटरों को DEFINITIONS के तहत मैन पेज के शीर्ष पर सूचीबद्ध किया गया है। हम ()नियंत्रण ऑपरेटरों के रूप में देख सकते हैं जैसे |कि दोनों उपधाराओं को शामिल करते हैं। और { }वर्तमान शेल में काम करता है और एक उपधारा को शामिल नहीं कर सकता है।
ग्लेन जैकमैन

@ कुसलानंद ने पाया, खंड 2.9.2: "यदि पाइपलाइन आरक्षित शब्द से शुरू होती है! और कमांड 1 एक उप-कमांड है, तो आवेदन यह सुनिश्चित करेगा कि कमांड 1 की शुरुआत में ऑपरेटर (एक या अधिक!) से अलग हो गया है। रिक्त> वर्ण। आरक्षित शब्द का व्यवहार (इसके बाद तुरंत ऑपरेटर द्वारा अनिर्दिष्ट किया जाता है। "स्पष्ट परिभाषा नहीं है, लेकिन मानक इसे (ऑपरेटर कहते हैं
Sergiy Kolodyazhnyy

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