Kilka miesięcy temu wytatuowałem bombę widelcową na ramieniu i pominąłem białe spacje, ponieważ uważam, że bez nich ładniej wygląda. Ale ku mojemu przerażeniu, czasami (nie zawsze), kiedy uruchamiam go w powłoce, nie uruchamia bomby widelcowej, ale po prostu daje błąd składniowy.
bash: syntax error near unexpected token `{:'
Wczoraj stało się, gdy próbowałem uruchomić go w powłoce Bash znajomego , a następnie dodałem spację i nagle zadziałało, :(){ :|:& };:
zamiast:(){:|:&};:
Czy białe znaki mają znaczenie; wytatuowałem błąd składniowy na moim ramieniu ?!
Wydaje się, że zawsze działa w Zsh , ale nie w Bash.
Powiązane pytanie nic nie wyjaśnia białych spacji, co tak naprawdę jest moim pytaniem; Dlaczego spacja jest potrzebna, aby Bash mógł poprawnie parsować?
bash
shell
syntax
syntax-error
spydon
źródło
źródło
Odpowiedzi:
Istnieje lista znaków oddzielających tokeny w BASH. Znaki te są nazywane metaznaki i są
|
,&
,;
,(
,)
,<
,>
, przestrzeń i tab . Z drugiej strony, nawiasy klamrowe ({
i}
) są zwykłymi znakami, które składają się na słowa.Pominie to drugie miejsce wcześniej
}
, ponieważ&
jest to metaznak. Dlatego twój tatuaż powinien mieć co najmniej jedną spację.źródło
on the other hand
... gra słów zamierzona? ;): D (Przepraszam, że nie skomentowałem tematu.){
i}
są słowami kluczowymi powłoki w tym kontekście. Tylko jeśli nie zostaną rozpoznane jako takie - z powodu braku otaczających spacji / metaznaków - są traktowane jako dosłowna część słowa, którego stają się częścią. (A potem jest nawias klamrowy, co dzieje się w innym kontekście.){foo} () { echo hello; }
„Nazwa”, zdefiniowana wbash
jako „słowo składające się wyłącznie ze znaków alfanumerycznych i znaków podkreślenia i rozpoczynające się od znaku alfabetu lub znaku podkreślenia”, dotyczy tylko nazw zmiennych.Po prostu wytatuuj a
wyskoczyć nad nią, a wszystko będzie dobrze.
źródło
Nawiasy klamrowe są bardziej jak nieparzyste słowa kluczowe niż specjalne symbole i wymagają spacji. Na przykład różni się to od nawiasów. Porównać:
który działa i:
która szuka polecenia o nazwie
{ls}
. Aby działać, musi to być:Średnik zatrzymuje przyjmowanie nawiasu zamykającego jako parametru do
ls
.Wszystko, co musisz zrobić, to powiedzieć ludziom, że używasz czcionki proporcjonalnej o raczej wąskim znaku spacji.
źródło
ls
.Chociaż nie jest łatwo widoczny w czcionce tatoo, między klamrą a okrężnicą znajduje się w rzeczywistości znak kolejności bajtów (BOM) (być może byłeś wystarczająco odurzony, kiedy dostałeś tatuaż, że go nie zauważyłeś, ale tak naprawdę jest) . Pozostawia to trzy oczywiste możliwości:
źródło
Wynika to z tego, jak analizuje powłoka. Potrzebujesz spacji po rozpoczęciu definicji funkcji, tj. Po
{
.są ważne. Z drugiej strony,
nie jest.
Tak naprawdę potrzebujesz takiego tatuażu:
Ze źródła :
Pominięcie spacji
{
powoduje, że{echo
interpretowany jest jako pojedynczy token.Równoważna forma
byłoby
Zauważ, że
{
w alternatywnej wersji nie ma spacji , ale podział linii powoduje, że powłoka rozpoznaje{
token.źródło
{echo
zanim osiągnął wymagany nawias otwierający?