Écrivez la fonction sur une ligne dans ~ / .bashrc

40

Pourquoi, quand j'essaie d'écrire une fonction sur une seule ligne du .bashrcfichier,

list(){ ls -a }

J'ai une erreur?

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

mais quand je l'écris en multi ligne c'est ok?

list(){
    ls -a
}
αғsнιη
la source
Il y a une dernière question équivalente sur le dépassement de pile .
sampablokuper

Réponses:

33

Les fonctions dans bashsont essentiellement appelées commandes composées (ou blocs de code). De 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.

Il n'y a aucune raison donnée, c'est juste la syntaxe.

Puisque la liste dans la fonction une ligne donnée ne se termine pas par une nouvelle ligne ou une ;, se bashplaint.

muru
la source
42

Il y a un ;besoin à la fin de la fonction:

list(){ ls -a ; }

devrait marcher.

La syntaxe d'une définition de fonction pour bash est spécifiée comme suit:

name () { list ; }

Notez qu'il inclut un ;qui ne fait pas partie de la list.

Le fait qu'il ;soit nécessaire ici est en quelque sorte une anomalie de la syntaxe. Ce n'est pas bashspécifique, c'est la même chose pour ksh, mais ça ;n'est pas obligatoire dans zsh.

Volker Siegel
la source
18

La fin d'une commande unique (";") est impliquée par la nouvelle ligne. Dans la version en ligne }est analysé comme un argument de la ls -acommande non terminée . Ce que vous pouvez voir si vous le faites:

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

Vous voyez comment la commande à l'intérieur de la déclaration de fonction engloutit l'accolade suivante?

Joe Atzberger
la source
2
Grande explication! Donc, ce n'est pas simplement une anomalie de syntaxe; il y a en fait une certaine logique à cela.
Don Hatch