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

12

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

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

Embora a barra invertida escape de aliases definidos pelo usuário, ela 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.

Eu encontrei esta questão de pergunta do superusuário & resposta, mas a resolução só se aplica a uma função incorporada, não a um comando do sistema.

Qual é o melhor para impor que o comando rm seja chamado e não um apelido ou função? Devo especificar o caminho completo para rm e todos os comandos do sistema que desejo garantir são executados corretamente? Existe uma maneira melhor?

    
por acm 13.09.2012 / 19:10

1 resposta

12

Você pode usar command para contornar a consulta 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 dado no $PATH ou especificando o caminho completo.

/usr/bin/env rm
/bin/rm
    
por 13.09.2012 / 19:13