O que devo saber quando defino uma função bash para usar o nome de um programa?

4

Em muitos casos, eu preciso criar funções com o mesmo nome de outros programas, e não tenho idéia se é uma boa maneira de usar o bash scripting.

Exemplo:

    function echo () {
        echo -n "$@" ;
    }  

Após o teste, parece que ele verifica os nomes das funções dentro do script antes dos caminhos dos binários. Quero ter certeza disso e de qualquer outra informação que eu deva saber.

    
por Jonas 05.11.2015 / 17:45

1 resposta

7
echo() {
  command echo -n "$@"
}

Usar command aqui significa pedir o comando echo (que por acaso é construído aqui) em vez da função que, de outra forma, teria precedência.

E, como aqui, echo também é construído (não é consultado em $PATH BTW, pois os recursos internos têm precedência sobre os comandos do sistema de arquivos), você também pode fazer:

echo() {
  builtin echo -n "$@"
}

Essa última abordagem é preferível em zsh , em que command echo executaria /bin/echo (exceto em sh emulação).

Existem algumas variações sutis entre os shells, mas a ordem de precedência é geralmente:

  1. especiais incorporados
  2. funções
  3. builtins
  4. comandos em $PATH (e a ordem depende da ordem em $PATH e na tabela hash conforme gerenciada pelo hash builtin)

Tendo em mente que alias e palavras-chave na sintaxe do shell ( for , if ...), quando não citados, são considerados antes desses.

A ordem de 1 e 2 é revertida em alguns shells como bash ou zsh . bash não permite que funções sejam definidas com o mesmo nome de um especial embutido quando chamado como sh .

    
por 05.11.2015 / 18:12

Tags