Uproszczona powodem jest istnienie jednego znaku: space.
Rozszerzenia nawiasów nie przetwarzają (niecytowanych) spacji.
{...}
Lista potrzebuje (UN-cytowany) przestrzenie.
Bardziej szczegółową odpowiedzią jest sposób, w jaki powłoka analizuje wiersz poleceń .
Pierwszym krokiem do przeanalizowania (zrozumienia) wiersza polecenia jest podzielenie go na części.
Te części (zwykle nazywane słowami lub tokenami) wynikają z dzielenia wiersza polecenia na każdym metaznaku z łącza :
- Dzieli polecenie na tokeny oddzielone stałym zestawem metaznaków: SPACJA, TAB, NEWLINE,;, (,), <,>, | i &. Typy tokenów obejmują słowa, słowa kluczowe, przekierowania we / wy i średniki.
Metaznaki: spacetabenter;,<>|i &.
Po podziale słowa mogą być typu (w rozumieniu powłoki):
- Wstępne przypisania poleceń:
LC=ALL ...
- Komenda
LC=ALL echo
- Argumenty
LC=ALL echo "hello"
- Przekierowanie
LC=ALL echo "hello" >&2
Rozszerzenie klamry
Tylko jeśli „ciąg nawiasu klamrowego” (bez spacji lub metaznaków) jest pojedynczym słowem (jak opisano powyżej) i nie jest cytowany , jest kandydatem do „rozwinięcia nawiasu klamrowego ”. Więcej kontroli zostanie przeprowadzonych później w strukturze wewnętrznej.
Zatem to: {ls,-l}
kwalifikuje się jako „Rozwinięcie nawiasu klamrowego”, aby stać się ls -l
albo jako first word
albo argument
(w bash, zsh jest inny).
$ {ls,-l} ### executes `ls -l`
$ echo {ls,-l} ### prints `ls -l`
Ale to nie będzie: {ls ,-l}
. Bash podzieli się spacei parsuje linię jako dwa słowa: {ls
i ,-l}
który wywoła command not found
(argument ,-l}
zostanie utracony):
$ {ls ,-l}
bash: {ls: command not found
Twoja linia: {ls;echo hi}
nie stanie się „rozszerzeniem nawiasu klamrowego” z powodu dwóch meta-znaków ;i space.
Zostanie on podzielony na trzy części tego: {ls
nowe polecenie: echo
hi}
. Zrozum, że ;wyzwala uruchomienie nowego polecenia. Polecenie {ls
nie zostanie odnalezione, a następne polecenie zostanie wydrukowane hi}
:
$ {ls;echo hi}
bash: {ls: command not found
hi}
Jeśli zostanie umieszczony po innym poleceniu, i tak uruchomi nowe polecenie po ;:
$ echo {ls;echo hi}
{ls
hi}
Lista
Jednym z poleceń „związek” jest „Brace List” (moje słowa) { list; }
.
Jak widać, jest on zdefiniowany spacjami i zamykaniem ;
.
Przestrzenie i ;są potrzebne, ponieważ oba {
i }
są „zarezerwowane Words ”.
Dlatego, aby zostać rozpoznanym jako słowa, muszą być otoczone meta-znakami (prawie zawsze:) space.
Jak opisano w punkcie 2 połączonej strony
- Sprawdza pierwszy token każdego polecenia, aby sprawdzić, czy jest to ...., {lub (, wówczas polecenie jest w rzeczywistości poleceniem złożonym.
Twój przykład: {ls;echo hi}
nie jest listą.
Potrzebuje zamknięcia ;i jednej spacji (przynajmniej) po {. Ostatni }jest określony przez zamknięcie ;.
To jest lista { ls;echo hi; }
. I to { ls;echo hi;}
jest również (rzadziej używane, ale ważne) (Dzięki @choroba za pomoc).
$ { ls;echo hi; }
A-list-of-files
hi
Ale jako argument (powłoka zna różnicę) dla polecenia, wywołuje błąd:
$ echo { ls;echo hi; }
bash: syntax error near unexpected token `}'
Uważaj jednak na to, co według Ciebie jest przetwarzane przez powłokę:
$ echo { ls;echo hi;
{ ls
hi
{
interpretowane jako lista poleceń, jeśli pojawia się na początku polecenia i jako rozszerzenie nawiasów klamrowych, ale nie jestem pewien.