escreve função em uma linha em ~ / .bashrc

27

Por que quando eu tento wite uma função em apenas uma linha no arquivo .bashrc ,

list(){ ls -a }

Eu recebo erro?

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

mas quando escrevo em multi linha, tudo bem?

list(){
    ls -a
}
    
por αғsнιη 09.09.2014 / 14:47

3 respostas

26

As funções em bash são essencialmente chamadas de comandos compostos (ou blocos de código). 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.

Não há nenhum motivo dado, é apenas a sintaxe.

Como a lista na função de uma linha não é terminada com uma nova linha ou com ; , bash reclama.

    
por muru 09.09.2014 / 14:57
23

Existe um ; necessário no final da função:

list(){ ls -a ; }

deve funcionar.

A sintaxe de uma definição de função para o bash é especificada como

name () { list ; }

Note que inclui um ; que não faz parte do list .

O ; necessário neste local é uma espécie de anomalia de sintaxe. Não é bash específico, é o mesmo para ksh , mas o ; não é necessário em zsh .

    
por Volker Siegel 09.09.2014 / 14:57
14

O fim de um único comando (";") está implícito na nova linha. Na versão oneline, } é analisado como um argumento para o comando ls -a não terminado. Que você pode ver se fizer:

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

Veja como o comando dentro da declaração de função engole a chaveta de trailing?

    
por Joe Atzberger 09.09.2014 / 22:34

Tags