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 dofor
lubwhile
, 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.