Função de gravação em uma linha em ~ / .bashrc


40

Por que quando tento escrever uma função em apenas uma linha no .bashrcarquivo,

list(){ ls -a }

Eu recebo erro?

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

mas quando eu escrevo em várias linhas está tudo bem?

list(){
    ls -a
}

Há uma pergunta posterior equivalente no Stack Overflow .
sampablokuper

Respostas:


33

As funções em bashsão essencialmente denominadas 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á motivo, é apenas a sintaxe.

Como a lista na função de linha única fornecida não termina com uma nova linha ou a ;, bashreclama.


42

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

list(){ ls -a ; }

Deveria trabalhar.

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

name () { list ; }

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

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


18

O final de um único comando (";") está implícito na nova linha. Na versão on-line }é analisada como um argumento para o ls -acomando não terminado . Que você pode ver se faz:

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

Veja como o comando dentro da declaração de função engole a cinta à direita?


2
Ótima explicação! Portanto, não é apenas uma anomalia de sintaxe; na verdade, há alguma lógica nisso.
Don escotilha
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.