przesłaniające funkcje zdefiniowane przez użytkownika o tej samej nazwie co polecenia systemowe

14

Ta funkcja istnieje w ~ / .bashrc jednego z moich użytkowników:

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

W moim skrypcie ksh, który muszą uruchomić użytkownicy, mam taką linię:

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

Chociaż ukośnik odwraca aliasy zdefiniowane przez użytkownika, nie powstrzymuje skryptu przed uruchamianiem funkcji zdefiniowanych przez użytkownika o tej samej nazwie. W rezultacie zamiast funkcji systemowej wywoływana jest funkcja rm () mojego użytkownika.

Znalazłem to pytanie administratora pytanie i odpowiedź, ale rozdzielczość odnosi się tylko do funkcji wbudowanej, a nie polecenia systemu.

Co najlepiej wymusić wywołanie polecenia rm, a nie alias lub funkcję? Czy muszę podać pełną ścieżkę do rm i każdą komendę systemową, którą chcę zapewnić, aby została wykonana poprawnie? Czy jest lepszy sposób?

acm
źródło

Odpowiedzi:

13

Możesz użyć commanddo obejścia normalnego wyszukiwania funkcji bash.

command rm

Przykład nieniszczący:

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

Możesz też wywołać go za pomocą env(uruchamiając pierwszy program o podanej nazwie na $PATHlub podając pełną ścieżkę.

/usr/bin/env rm
/bin/rm
Daniel Beck
źródło
dzięki, „polecenie” jest dokładnie tym, czego szukam. Wydaje się to jednak trochę tępy, że trzeba go używać do każdego wykonywanego polecenia systemowego. Wydaje mi się, że jedynym pewnym sposobem na odpalenie polecenia systemu jest określenie całej ścieżki. Jednak przy takim podejściu polegasz na tym, że polecenia są na tej samej ścieżce w różnych dystrybucjach.
acm
@acm Jak napisałem, możesz także przejść envtrasę. Dodatkowo możesz określić lokalizację każdego narzędzia raz i zapisać je w zmiennej, np RM=$( /usr/bin/env which rm ); [much more code]; $RM some_file;. Możesz także zmienić sposób wykonywania skryptu. Zwykle funkcje i aliasy nie są dziedziczone, w przeciwnym razie cały czas łamałyby skrypty.
Daniel Beck