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 बताते हैं:
यह मान्यता तब होगी जब कोई भी वर्ण उद्धृत नहीं किया जाता है और जब इस शब्द का उपयोग किया जाता है:
-एक कमांड का पहला शब्द
जैसा कि कुसलानंद के उत्तर में उल्लेख किया गया है "पोसिक्स व्याकरण में दिखाए गए स्थान वे रिक्त स्थान नहीं हैं जो शेल इनपुट डेटा में होने की आवश्यकता है, लेकिन केवल व्याकरण को प्रदर्शित करने का एक तरीका है। यह तथ्य है कि ब्रेस आरक्षित शब्द हैं जो कि निहित है। उन्हें व्हॉट्सएप से घिरे रहना होगा "जैसा कि माइकल होमर ने टिप्पणियों में बताया है :" यदि रिक्त स्थान अपने आप में महत्वपूर्ण थे, तो उन्हें उत्पादन में सूचीबद्ध करने की आवश्यकता होगी "
मामला समाप्त।
{
और (
दोनों को कंपोज़ कमांड की POSIX परिभाषा द्वारा आरक्षित शब्द माना जाता है" cf। "इनमें से प्रत्येक यौगिक कमांड में शुरुआत में एक आरक्षित शब्द या नियंत्रण ऑपरेटर होता है"।
' '
) शामिल करना होगा। इसके बजाय, रिक्त स्थान शब्दों द्वारा निहित है कि टोकन शब्द क्या हैं।
command : simple_command | compound_command | compound_command redirect_list | function_definition ;
एक ऐसा उत्पादन है जो कहता है कि जहां आपके पास एक कमांड हो सकती है, यह साधारण कमांड, कंपाउंड कमांड या पुनर्निर्देशन के साथ कंपाउंड कमांड या फ़ंक्शन परिभाषा में से एक हो सकता है।