substituindo funções definidas pelo usuário com o mesmo nome dos comandos do sistema

14

Esta função existe em um dos ~ / .bashrc dos meus usuários:

function rm()
{
        ls $*
        echo "rm?"
        read ans
        if [ "$ans" == 'y' ]; then
                /bin/rm $*
        fi
}

No meu script ksh que os usuários precisam executar, eu tenho uma linha como esta:

[[ "$KEEP" = "" ]] && \rm $FILE

Enquanto a barra invertida escapa aliases definidos pelo usuário, não impede que o script execute funções definidas pelo usuário com o mesmo nome. Como resultado, a função rm () do meu usuário é chamada em vez da função do sistema.

Encontrei essa pergunta e resposta da pergunta do superusuário, mas a resolução se aplica apenas a uma função interna, não a um comando do sistema.

Qual é o melhor para impor o comando rm de ser chamado, e não um alias ou função? Preciso especificar o caminho completo para a rm e todos os comandos do sistema que eu quero garantir que sejam executados corretamente? Existe uma maneira melhor?

acm
fonte

Respostas:

13

Você pode usar commandpara contornar a pesquisa normal da função bash.

command rm

Exemplo não destrutivo:

$ alias which='which -s'
$ function which { echo "which $@?" ; }
$ which which
which -s which?
$ command which which
/usr/bin/which

Como alternativa, chame-o usando env(executando o primeiro programa com o nome fornecido no $PATH, ou especificando o caminho completo.

/usr/bin/env rm
/bin/rm
Daniel Beck
fonte
obrigado, "comando" é exatamente o que estou procurando. Parece meio obtuso ter que usar para todos os comandos do sistema executados. Eu acho que a única maneira certa de garantir que você esteja executando o comando do sistema é especificar todo o caminho. No entanto, você está confiando nos comandos que estão no mesmo caminho em diferentes distros com essa abordagem.
Acm
@ ACM Como escrevi, você também pode seguir o envcaminho. Além disso, você pode determinar a localização de cada ferramenta uma vez e armazená-la em uma variável, por exemplo RM=$( /usr/bin/env which rm ); [much more code]; $RM some_file;. Você também pode alterar a maneira como seu script é executado. Geralmente, funções e aliases não são herdados; caso contrário, eles quebram scripts o tempo todo.
Daniel Beck