TL; DR : Dlaczego grupa nawiasów POSIX potrzebuje spacji po {zarezerwowanym słowie, a podpowłoka nie po zarezerwowanym słowie (?
Gramatyka powłoki POSIX definiuje grupę nawiasów i podpowłokę w następujący sposób
brace_group : Lbrace compound_list Rbrace
subshell : '(' compound_list ')'
Teraz, jeśli czytamy to dosłownie, spacje są znaczące. Oznaczałoby to, że musi istnieć przestrzeń otwierająca i zamykająca nawias klamrowy i nawias jak w
{ echo hello world; }
( echo hello world )
Spowodowałoby to również dostosowanie do definicji poleceń złożonych :
Każde z tych poleceń złożonych ma na początku zarezerwowane słowo lub operator sterujący, a na końcu odpowiednie zarezerwowane słowo lub operator terminatora.
Jednak to, co nie ma sensu, to dlaczego (list)i ( list )działa dobrze (ta przestrzeń po (nie jest wymagana), jednak rozwijanie nawiasów musi mieć wiodącą przestrzeń, tzn. {echo hello;}Nie działa.
Oczywiście słowo zastrzeżone traktowane jako słowo powłoki miałoby sens później potrzebując spacji, aby dostosować się do koncepcji podziału pola , jednak sama definicja nie wspomina o spacjach. Ponadto, jeśli {i (oba są uważane za słowa zastrzeżone według definicji POSIX polecenia złożonego, dlaczego są traktowane inaczej w odniesieniu do znaku spacji po tych zastrzeżonych słowach? Teraz instrukcja ksh (1) zawiera:
Słowa, które są sekwencjami znaków, są rozdzielane niecytowanymi białymi znakami (spacja, tabulator i nowa linia) lub metaznakami (<,>, |,;, &, (i))
Innymi słowy, sensowne jest, aby ksh rozpoznał (jako separator słów, gdzie pierwsze słowo byłoby poleceniem lub przypisaniem zmiennej. POSIX jednak nie pojawia się (jako meta-znak. Jedynym możliwym wyjaśnieniem, które znalazłem, jeśli chodzi o gramatykę POSIX, jest to, że {jest uważane za „token”, gdzie (nie ma go jako jednego.
/* These are reserved words, not operator tokens, and are
recognized when reserved words are recognized. */
%token Lbrace Rbrace Bang
/* '{' '}' '!' */
Jakie byłoby dokładne uzasadnienie tej rozbieżności?
Zaakceptowane uwagi do odpowiedzi:
Przeniesiono zaakceptowany znacznik na odpowiedź Izaaka, ponieważ zawiera on sam formularz , który bezpośrednio odpowiada na moje pytanie:
Na przykład „(” i „)” są operatorami sterującymi, więc nie
<space>są potrzebne w (liście). Jednak „{” i „}” są słowami zastrzeżonymi w {list;}, więc w tym przypadku wiodące<space>i<semicolon>są wymagane.Akceptacja odpowiedzi Kusalanandy. Odpowiedź Kusalanandy dotyczy tego, czego potrzebowałem, choć głównie z nieformalnego i intuicyjnego punktu widzenia; wskazuje, że{to słowo zastrzeżone i(jest operatorem. Michael Homer zauważył również to samo w komentarzach - że definicja Compound Command stwierdza (wyróżnienie dodane):Każda z tych złożonych poleceń ma słowa zastrzeżonego lub operatora kontroli na początku
{są zdefiniowane jako słowo zastrzeżone, podobne doforlubwhile, wymienione w gramatyce powłoki (patrz ostatni blok kodu w pytaniu)Sekcja 2.9 stanowi (wyróżnienie dodane):
W szczególności reprezentacje obejmują odstępy między tokenami w niektórych miejscach, w których
<blank>s nie byłoby konieczne (gdy jeden z tokenów jest operatorem).Chociaż standard nie definiuje wyraźnie
(jako operatora,(jest nazywany operatorem; konkretnie, sekcja 2.9.2 mówiJeśli potok zaczyna się od słowa zarezerwowanego! a polecenie1 jest poleceniem podpowłoki, aplikacja powinna dopilnować, aby (operator na początku polecenia 1 był oddzielony od! jednym lub kilkoma znakami. Zachowanie słowa zarezerwowanego! bezpośrednio po nim (operator nie jest określony.
Pytanie o przepełnienie stosu przez Digital Trauma wskazuje na sekcję 2.4 dotyczącą słów zastrzeżonych:
Rozpoznanie to nastąpi tylko wtedy, gdy żaden z tych znaków nie jest cytowany i gdy słowo jest użyte jako:
- Pierwsze słowo polecenia
Jak wspomniano w odpowiedzi Kusalanandy: „Spacje pokazane w gramatyce POSIX nie są spacjami, które muszą znajdować się w danych wejściowych powłoki, ale jedynie sposobem wyświetlania samej gramatyki. Fakt, że nawiasy klamrowe są zastrzeżonymi słowami, sugeruje, że muszą być otoczone białymi spacjami ”. Jak wspomniał Michael Homer w komentarzach:„ Gdyby przestrzenie były znaczące same w sobie, musiałyby zostać wymienione w produkcji ”
Sprawa zamknięta.
{i (oba są uważane za słowa zastrzeżone według definicji POSIX polecenia złożonego”, por. „Każde z tych poleceń złożonych ma na początku zarezerwowane słowo lub operator sterujący ”.
' '). Zamiast tego, spacje są implikowane przez to, jakie tokeny są słowami.
command : simple_command | compound_command | compound_command redirect_list | function_definition ;jest to produkcja, która mówi, gdzie możesz mieć komendę, może to być jedna z prostych komend, komenda złożona lub komenda złożona z przekierowaniem lub definicja funkcji.