Zauważyłem, że {
można to wykorzystać w rozszerzaniu nawiasów:
echo {1..8}
lub w grupie poleceń:
{ls;echo hi}
Skąd Bash zna różnicę?
bash
shell-script
uwielbia wiosnę
źródło
źródło
{
interpretowane jako lista poleceń, jeśli pojawia się na początku polecenia i jako rozszerzenie nawiasów klamrowych, ale nie jestem pewien.{ls;echo hi}
nie jest legalnebash
. Potrzebujesz spacji po otwierającym nawiasie i średnikiem przed zamykającym.Odpowiedzi:
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 :
Metaznaki: spacetabenter;,<>|i &.
Po podziale słowa mogą być typu (w rozumieniu powłoki):
LC=ALL ...
LC=ALL echo
LC=ALL echo "hello"
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 jakofirst word
alboargument
(w bash, zsh jest inny).Ale to nie będzie:
{ls ,-l}
. Bash podzieli się spacei parsuje linię jako dwa słowa:{ls
i,-l}
który wywołacommand not found
(argument,-l}
zostanie utracony):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 wydrukowanehi}
:Jeśli zostanie umieszczony po innym poleceniu, i tak uruchomi nowe polecenie po ;:
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
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).Ale jako argument (powłoka zna różnicę) dla polecenia, wywołuje błąd:
Uważaj jednak na to, co według Ciebie jest przetwarzane przez powłokę:
źródło
;
i}
.{ ls;}
działa, ponieważ średnik jest już meta-znakiem.Blok
{
jest słowem kluczowym powłoki, więc musi być oddzielony spacją od następnego słowa, podczas gdy podczas rozwijania nawiasów klamrowych nie powinno być spacji (jeśli chcesz nawiasować klamrę, spacja, musisz uciec:)echo {\ ,a}{b,c}
.Możesz użyć rozwinięcia nawiasu na początku polecenia:
Nie można go jednak użyć do rozwinięcia do bloku, ponieważ parsowanie poleceń grupowania odbywa się przed rozwinięciami:
źródło
Wie, sprawdzając składnię wiersza poleceń. W ten sam sposób wie, że w wyrażeniu
echo echo
pierwsze echo powinno być traktowane jako polecenie, a drugie echo jako parametr pierwszego echa.W bash jest to bardzo proste, ponieważ
{ cmd; }
powinno mieć spacje i średniki. Jednak na przykład w Zsh nie są one potrzebne, ale nadal analizując kontekst{}
powłoki, jest w stanie stwierdzić, co należy zrobić z jej zawartością.Rozważ następujące:
Obie zwracają aktualną datę, ale
zwraca,
1 2 3
ponieważ shell zna{}
argument dla poleceniaecho
, dlatego należy go rozwinąć.źródło
{
po którym następuje niecytowana spacja, nie rozpoczyna rozwijania nawiasu klamrowego w bash{
. Nigdzie nie podano miejsca, ponieważ powłoka dzieli cały wiersz poleceń na spacje.Po pierwsze, nawias klamrowy złożony musi być samym słowem i pierwszym słowem wiersza poleceń:
Po drugie, poszczególne nawiasy klamrowe nie są wyjątkowe (jak widać powyżej). Puste nawiasy klamrowe również nie są wyjątkowe:
Wszystko bez przecinków jest również po prostu sobą
Tutaj zaczyna się akcja.
Zasadniczo więc, aby rozwinąć się nawias klamrowy, potrzebujemy jednego słowa (niepodzielonego na pola na białych znakach), wewnątrz którego występuje co najmniej jeden przypadek,
{...}
w którym występuje co najmniej jeden przecinek.Nawiasem mówiąc, może to być pierwsze słowo w wierszu poleceń:
źródło