Überschreiben von benutzerdefinierten Funktionen mit demselben Namen wie Systembefehle

14

Diese Funktion existiert in einem der ~ / .bashrc meiner Benutzer:

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

In meinem ksh-Skript, das Benutzer ausführen müssen, habe ich eine Zeile wie die folgende:

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

Während der umgekehrte Schrägstrich benutzerdefinierte Aliase übergeht, wird das Skript nicht daran gehindert, benutzerdefinierte Funktionen mit demselben Namen auszuführen. Infolgedessen wird die Funktion rm () meines Benutzers anstelle der Systemfunktion aufgerufen.

Ich habe diese Superuser-Frage, Frage & Antwort, gefunden, aber die Auflösung bezieht sich nur auf eine eingebaute Funktion, nicht auf einen Systembefehl.

Was ist das Beste, um den Aufruf des Befehls rm zu erzwingen und nicht einen Alias ​​oder eine Funktion? Muss ich den vollständigen Pfad zu rm und jeden Systembefehl angeben, der ordnungsgemäß ausgeführt werden soll? Gibt es einen besseren Weg?

acm
quelle

Antworten:

13

Mit können Sie commanddie normale Suche nach Bash-Funktionen umgehen.

command rm

Zerstörungsfreies Beispiel:

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

Alternativ können Sie es aufrufen, indem Sie envdas erste Programm mit dem angegebenen Namen auf ausführen $PATHoder indem Sie den vollständigen Pfad angeben .

/usr/bin/env rm
/bin/rm
Daniel Beck
quelle
Danke, "Befehl" ist genau das, wonach ich suche. Es scheint ziemlich stumpf zu sein, dies für jeden ausgeführten Systembefehl zu verwenden. Ich denke, der einzige sichere Weg, um sicherzustellen, dass Sie den Systembefehl ausführen, besteht darin, den gesamten Pfad anzugeben. Sie verlassen sich jedoch darauf, dass die Befehle bei diesem Ansatz in verschiedenen Distributionen auf demselben Pfad sind.
Am
@acm Wie ich geschrieben habe, kannst du auch die envStrecke gehen . Zusätzlich können Sie die Position jedes Werkzeugs einmal bestimmen und in einer Variablen speichern, z RM=$( /usr/bin/env which rm ); [much more code]; $RM some_file;. Sie können auch ändern, wie Ihr Skript ausgeführt wird. Normalerweise werden Funktionen und Aliase nicht vererbt, da sie sonst die ganze Zeit über Skripte unterbrechen würden.
Daniel Beck