remplacement des fonctions définies par l'utilisateur portant le même nom que les commandes système

14

Cette fonction existe dans l'un des ~ / .bashrc de mes utilisateurs:

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

Dans mon script ksh que les utilisateurs doivent exécuter, j'ai une ligne comme celle-ci:

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

Bien que la barre oblique inverse échappe aux alias définis par l'utilisateur, elle n'empêche pas le script d'exécuter des fonctions définies par l'utilisateur portant le même nom. Par conséquent, la fonction rm () de mon utilisateur est appelée à la place de la fonction système.

J'ai trouvé cette question et réponse de superutilisateur, mais la résolution ne s'applique qu'à une fonction intégrée, pas à une commande système.

Quel est le meilleur moyen de faire en sorte que la commande rm ne soit pas appelée, et non un alias ou une fonction? Dois-je spécifier le chemin d'accès complet à rm et chaque commande système que je veux m'assurer est exécutée correctement? Y a-t-il une meilleure façon?

acm
la source

Réponses:

13

Vous pouvez utiliser commandpour contourner la recherche de fonction bash normale.

command rm

Exemple non destructif:

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

Sinon, appelez-le en utilisant env(en exécutant le premier programme avec le nom donné sur le $PATH, ou en spécifiant le chemin complet.

/usr/bin/env rm
/bin/rm
Daniel Beck
la source
merci, "commande" est exactement ce que je recherche. Il semble cependant assez difficile à utiliser pour chaque commande système exécutée. Je suppose que le seul moyen sûr de tirer pour exécuter la commande système est de spécifier le chemin complet. Cependant, vous misez sur le fait que les commandes sont sur le même chemin à travers différentes distributions avec cette approche.
acm
@acm Comme je l'ai écrit, vous pouvez également suivre la envvoie. De plus, vous pouvez déterminer l'emplacement de chaque outil une fois et le stocker dans une variable, par exemple RM=$( /usr/bin/env which rm ); [much more code]; $RM some_file;. Vous pouvez également modifier la façon dont votre script est exécuté. Habituellement, les fonctions et les alias ne sont pas hérités, sinon ils casseraient les scripts tout le temps.
Daniel Beck