anular funciones definidas por el usuario con el mismo nombre que los comandos del sistema

14

Esta función existe en uno de mis usuarios ~ / .bashrc:

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

En mi script ksh que los usuarios deben ejecutar, tengo una línea como esta:

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

Si bien la barra diagonal inversa escapa a los alias definidos por el usuario, no impide que el script ejecute funciones definidas por el usuario con el mismo nombre. Como resultado, se llama a la función rm () de mi usuario en lugar de la función del sistema.

Encontré esta pregunta y respuesta de pregunta de superusuario, pero la resolución solo se aplica a una función incorporada, no a un comando del sistema.

¿Qué es lo mejor para hacer que se invoque el comando rm y no un alias o función? ¿Debo especificar la ruta completa a rm y cada comando del sistema que quiero asegurar se ejecuta correctamente? ¿Hay una mejor manera?

acm
fuente

Respuestas:

13

Puede usar commandpara evitar la búsqueda normal de la función bash.

command rm

Ejemplo no destructivo:

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

Alternativamente, llámelo usando env(ejecutando el primer programa con el nombre dado en el $PATH, o especificando la ruta completa.

/usr/bin/env rm
/bin/rm
Daniel Beck
fuente
gracias, "comando" es exactamente lo que estoy buscando. Sin embargo, parece un poco obtuso tener que usarlo para cada comando del sistema ejecutado. Supongo que la única forma segura de asegurarse de que está ejecutando el comando del sistema es especificar la ruta completa. Sin embargo, confía en que los comandos se encuentran en la misma ruta en diferentes distribuciones con ese enfoque.
acm
@acm Como escribí, también puedes ir por la envruta. Además, puede determinar la ubicación de cada herramienta una vez y almacenarla en una variable, por ejemplo RM=$( /usr/bin/env which rm ); [much more code]; $RM some_file;. También podría cambiar cómo se ejecuta su script. Por lo general, las funciones y los alias no se heredan, de lo contrario, romperían los scripts todo el tiempo.
Daniel Beck