Usando “@” como nome da função bash

5

É possível usar o símbolo "@" como um nome de função em um script bash? O seguinte não funciona:

function @() {
  echo hello
}
    
por George 18.02.2016 / 23:47

3 respostas

4

De man bash

   name   A word consisting only of alphanumeric characters and underscores, 
          and beginning with an  alphabetic character or an underscore.  Also 
          referred to as an identifier.

Shell functions are declared as follows:
          name () compound-command [redirection]
          function name [()] compound-command [redirection]
    
por 19.02.2016 / 00:03
4

EDIT 2: Embora @ não seja problemático na baunilha, ele é usado como um operador de agrupamento de padrões quando o opção de shell extglob está definida, um simples echo @() pode travar seu shell sob certas condições. Mais uma razão para não usar @ como um identificador '.

EDIT 1: Para esclarecer, não é permitido pela definição de um identificador. Eu não estou recomendando isso. Só estou dizendo que, para compatibilidade com versões anteriores, é possível no bash usar @ como um identificador.

@() { echo "$1 world"; }
@ hello
alias @="echo hello"
@ world

@ é usado como um parâmetro especial ( $@ ) e para matrizes ( ${arr[@]} ), mas em nenhum outro lugar. O Bash não o impedirá de usá-lo para identificadores como aliases e funções, mas não nomes de variáveis.

Algumas pessoas alias @ to sudo , para que possam executar comandos como @ apt-get install .

A principal razão pela qual eu não usaria @ como um identificador de shell é que estou tão acostumado com a semântica de @ em Makefiles que silencia comandos sem efeitos colaterais.

BTW: funciona da mesma forma em zsh.

    
por 18.02.2016 / 23:55
3

A nomenclatura de funções é bastante semelhante aos caracteres permitidos para o alias:
De man bash :

The characters /, $, ', and = and any of the shell metacharacters or quoting characters listed above may not appear in an alias name.

metacharacter
One of the following: | & ; ( ) < > space tab

Então, exceto: / $ '= | & ; () < > guia de espaço

qualquer outro caractere deve ser válido para nomes de alias e funções.

No entanto, o caractere @ também é usado para @(pattern-list) quando o extglob está ativo. Por padrão, o extglob está ativo em shells interativos.

Então, isso deve falhar:

$ @(){ echo "hello"; }
bash: syntax error near unexpected token '}'

No entanto, isso funciona:

$  bash -c '@(){ echo "hello"; }; @'
hello

E isso também deve funcionar:

$ shopt -u extglob                 ### keep this as an independent line.
$ @(){ echo "hello"; }             
$ @
hello

Também é possível fazer isso:

$ f(){ echo "yes"; }
$ alias @=f
$ @
yes

Um alias é flexível em quais símbolos ele aceita.

    
por 19.02.2016 / 01:43

Tags