sovrascrivendo le funzioni definite dall'utente con lo stesso nome dei comandi di sistema


14

Questa funzione esiste in uno dei miei ~ / .bashrc dei miei utenti:

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

Nel mio script ksh che gli utenti devono eseguire, ho una riga come questa:

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

Mentre la barra rovesciata sfugge agli alias definiti dall'utente, non impedisce allo script di eseguire funzioni definite dall'utente con lo stesso nome. Di conseguenza, al posto della funzione di sistema viene chiamata la funzione rm () dell'utente.

Ho trovato la domanda e la risposta di questa domanda da superutente, ma la risoluzione si applica solo a una funzione integrata, non a un comando di sistema.

Qual è il migliore per imporre il richiamo del comando rm e non un alias o una funzione? Devo specificare il percorso completo di rm e ogni comando di sistema che voglio assicurare sia eseguito correttamente? C'è un modo migliore?

Risposte:


13

È possibile utilizzare commandper aggirare la normale ricerca della funzione bash.

command rm

Esempio non distruttivo:

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

In alternativa, chiamalo usando env(eseguendo il primo programma con il nome indicato sul $PATH, o specificando il percorso completo.

/usr/bin/env rm
/bin/rm

grazie, "comando" è esattamente quello che sto cercando. Sembra un po 'ottuso dover usare per ogni comando di sistema eseguito però. Immagino che l'unico modo sicuro per assicurarti di eseguire il comando di sistema sia specificare l'intero percorso. Tuttavia, stai puntando sul fatto che i comandi si trovano sullo stesso percorso tra diverse distro con quell'approccio.
acm,

@acm Come ho scritto, puoi anche seguire il envpercorso. Inoltre, è possibile determinare la posizione di ogni strumento una volta e memorizzarla in una variabile, ad es RM=$( /usr/bin/env which rm ); [much more code]; $RM some_file;. Puoi anche cambiare la modalità di esecuzione del tuo script. Di solito, funzioni e alias non vengono ereditati, altrimenti interrompono continuamente gli script.
Daniel Beck
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.