Schreibe die Funktion in einer Zeile in ~ / .bashrc

40

Warum, wenn ich versuche, eine Funktion nur in einer Zeile in eine .bashrcDatei zu schreiben ,

list(){ ls -a }

Bekomme ich fehler?

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

aber wenn ich es mehrzeilig schreibe ist es ok?

list(){
    ls -a
}
αғsнιη
quelle
Es gibt eine spätere, gleichwertige Frage zum Stapelüberlauf .
sampablokuper

Antworten:

33

Funktionen in bashwerden im Wesentlichen zusammengesetzte Befehle (oder Codeblöcke) genannt. Von 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.

Es gibt keinen Grund, es ist nur die Syntax.

Da die Liste in der angegebenen einzeiligen Funktion nicht mit einem Zeilenumbruch oder einem abgeschlossen wird ;, bashklagt.

muru
quelle
42

Am ;Ende der Funktion wird Folgendes benötigt:

list(){ ls -a ; }

sollte arbeiten.

Die Syntax einer Funktionsdefinition für Bash wird als angegeben

name () { list ; }

Beachten Sie, dass es eine enthält ;, die nicht Teil der ist list.

Dass das ;an dieser Stelle erforderlich ist, ist eine Art Syntaxanomalie. Es ist nicht bashspezifisch, es ist dasselbe für ksh, aber es ;ist nicht erforderlich in zsh.

Volker Siegel
quelle
18

Das Ende eines einzelnen Befehls (";") wird durch die neue Zeile impliziert. In der Online-Version }wird als Argument der nicht abgeschlossene ls -aBefehl analysiert . Was Sie sehen können, wenn Sie tun:

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

Sehen Sie, wie der Befehl in der Funktionsdeklaration die nachgestellte geschweifte Klammer verschluckt?

Joe Atzberger
quelle
2
Tolle Erklärung! Es handelt sich also nicht nur um eine Syntaxanomalie. Es gibt tatsächlich eine Logik.
Don Hatch