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

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

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

Exemplo:

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

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

Responder1

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

Usar commandaqui significa pedir o echocomando (que está embutido aqui) em vez da função que de outra forma teria precedência.

E como aqui echotambém é um builtin (não é pesquisado no $PATHBTW, pois os builtins 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, onde command echoseria executada /bin/echo(exceto na shemulação).

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

  1. recursos especiais
  2. funções
  3. embutidos
  4. comandos em $PATH(e a ordem depende da ordem em $PATHe na hashtabela gerenciada pelo hashbuiltin)

Lembrando que aliases e palavras-chave na sintaxe do shell ( for, if...), quando não citados, são considerados antes destes.

A ordem de 1e 2é invertida em alguns shells como bashou zsh. bashnão permite que funções sejam definidas com o mesmo nome de um recurso interno especial quando invocado como sh.

informação relacionada