Napisz funkcję w jednym wierszu do ~ / .bashrc

40

Dlaczego, gdy próbuję zapisać funkcję w jednym wierszu do .bashrcpliku,

list(){ ls -a }

Dostaję błąd?

bash: /home/kasiya/.bashrc: line num: syntax error: unexpected end of file

ale kiedy piszę to w wielu wierszach, jest w porządku?

list(){
    ls -a
}
αғsнιη
źródło
Późniejsze, równoważne pytanie dotyczy przepełnienia stosu .
sampablokuper

Odpowiedzi:

33

Funkcje w bashsą zasadniczo nazwanymi poleceniami złożonymi (lub blokami kodu). Od man bash:

Compound Commands
   A compound command is one of the following:
   ...
   { list; }
          list  is simply executed in the current shell environment.  list
          must be terminated with a newline or semicolon.  This  is  known
          as  a  group  command. 

...
Shell Function Definitions
   A shell function is an object that is called like a simple command  and
   executes  a  compound  command with a new set of positional parameters.
   ... [C]ommand is usually a list of commands between { and },  but
   may  be  any command listed under Compound Commands above.

Nie podano żadnego powodu, to tylko składnia.

Ponieważ lista w podanej funkcji jednowierszowej nie jest zakończona znakiem nowej linii lub a ;, bashnarzeka.

muru
źródło
42

Na ;końcu funkcji jest potrzebne:

list(){ ls -a ; }

powinno działać.

Składnia definicji funkcji dla bash jest określona jako

name () { list ; }

Pamiętaj, że zawiera on element, ;który nie jest częścią list.

To, co ;jest wymagane w tym miejscu, jest rodzajem anomalii składni. Nie jest bashspecyficzny, jest taki sam ksh, ale nie ;jest wymagany w zsh.

Volker Siegel
źródło
18

Koniec pojedynczego polecenia („;”) jest sugerowany przez nowy wiersz. W wersji oneline }jest analizowany jako argument niezakończonego ls -apolecenia. Które możesz zobaczyć, jeśli:

$ foo(){ echo "a" }
}
$ foo
a }

Zobacz, jak polecenie w deklaracji funkcji połyka nawias klamrowy końcowy?

Joe Atzberger
źródło
2
Świetne wyjaśnienie! Więc to nie tylko anomalia składniowa; jest w tym trochę logiki.
Don Hatch,